Sida 4 av 11

Re: Hur använda Raspberry Pi för lösning?

Postat: 23 januari 2014, 21:14:51
av Spisblinkaren
Nu har jag fanimej lyckats programmera Arduino UNO till att blinka enligt bifogad video :D

När jag först pluggade in UNO'n till datorn så blinkade samma lysdiod typ 1 gång per sekund men då var tiden för "på" respektive "av" lika stor (vilket bara var en indikation på att den så kallade bootloadern fanns).

Bara för att se om jag hade nån kontroll ändrade jag förhållandet mellan på och av till 1:10 vilket är det ni ser.

Jag har sällan blivit så glad över så lite! Men detta betyder att jag har kontakt med grejerna vilket inte var helt trivialt.

Mycket mer avancerad programmering väntar med spänning!



MVH/Roger_

Re: Hur använda Raspberry Pi för lösning?

Postat: 27 januari 2014, 22:49:44
av Spisblinkaren
Min plan nu är att gå Arduino-skolan för att sedan koppla upp ett RC-servo till en PWM-utgång.

Iom att den preliminära upplösningen hos wait-funktionen är så lång som 1ms och servot kräver mindre än 1ms positiv puls för ena läget och 2ms positiv puls för andra läget (T~20ms) så kommer jag bara kunna styra servot till ytterlägerna med befintlig wait-rutin.

Jag måste alltså skapa en wait-rutin som har upplösning i us-området för att steglöst kunna styra servot från ena ytterlighetsläget till det andra. Men detta är ett sekundärt problem.

Min nästa utmaning och bygge är alltså:

1) Klura ut hur PWM-rutinen fungerar
2) Enabla rätt utgångs-pinne
3) Koppla in en brytare till en av "Interrupt-on-change"-ingångarna.
4) Börja med polling av denna pinne
5) Generera 1ms för ena läget av brytaren, 2ms för den andra
6) Vippa fram och tillbaks på brytaren och filma fenomenet :D

MVH/Roger

Re: Hur använda Raspberry Pi för lösning?

Postat: 31 januari 2014, 23:28:43
av Spisblinkaren
Nu börjar det likna nåt :)

Häromdagen lyckades jag styra mitt servo som jag ville dvs till praktiskt taget ändlägena.

Detta pga en function jag tipsades om på Arduinos forum. Denna funtion heter delayMicroseconds().

Jag trycte således in 500us respektive 2500us och hela servots maximala 150 graders utslag genererades.

Bifogad video visar dock bara utslaget för 1ms respektive 2ms dvs typ 90 grader.

Nästa steg involverar kontinuerlig styrning av servot dvs A/D-omvandling som blir bra att kunna inför skarpt läge på lite längre sikt.

Se och beundra :)



MVH/Roger

Re: Hur använda Raspberry Pi för att sampla och lägga i data

Postat: 1 februari 2014, 01:46:49
av nifelheim
grattis :tumupp:

Re: Hur använda Raspberry Pi för att sampla och lägga i data

Postat: 2 februari 2014, 00:39:53
av Krille Krokodil
Se där, du flyger ju fram nu. :)

Kan man grunderna i C så går det sedan att att göra mycket avancerade
saker lätt genom att använda bibliotek eller sno någon annans färdiga kod
och modifiera den.

Finns färdiga bibliotek till Arduino för att skriva ut data till en fil på ett SD-kort
med FAT filsystem, så det kommer du enkelt kunna göra om du gnuggar in lite C
till.

Re: Hur använda Raspberry Pi för att sampla och lägga i data

Postat: 2 februari 2014, 00:57:06
av Magnus_K
Snyggt rogerk8! :tumupp:
Avundas dina strukturella metoder för inlärning.

Tänkte bara fråga; är det fortfarande aktuellt att använda R-Pi för detta projekt? Annars kanske det vore lämpligt att byta trådnamn till ...Arduino... istället?
(Är av mest egoistiska skäl då jag är mer intresserad av Arduino än R-Pi och titeln gör att jag missar tråden ibland)

Re: Hur använda Raspberry Pi för att sampla och lägga i data

Postat: 2 februari 2014, 20:14:56
av Spisblinkaren
nifelheim skrev:grattis :tumupp:
Tack :)

Re: Hur använda Raspberry Pi för att sampla och lägga i data

Postat: 2 februari 2014, 20:21:33
av Spisblinkaren
Krille Krokodil skrev:Se där, du flyger ju fram nu. :)

Kan man grunderna i C så går det sedan att att göra mycket avancerade
saker lätt genom att använda bibliotek eller sno någon annans färdiga kod
och modifiera den.
Tack :)

Mina C-kunskaper är som du förstår mycket dåliga men jag lär mig väl vartefter.

Än så länge är det jag gjort inte speciellt märkvärdigt. Typ bara ändrat lite i den medföljande blink-rutinen.
Finns färdiga bibliotek till Arduino för att skriva ut data till en fil på ett SD-kort
med FAT filsystem, så det kommer du enkelt kunna göra om du gnuggar in lite C
till.
Tack för det tipset! Skall komma ihåg det när det blir allvarligt svårt ;)

MVH/Roger

Re: Hur använda Raspberry Pi för att sampla och lägga i data

Postat: 2 februari 2014, 20:26:44
av Spisblinkaren
Magnus_K skrev:Snyggt rogerk8! :tumupp:
Avundas dina strukturella metoder för inlärning.

Tänkte bara fråga; är det fortfarande aktuellt att använda R-Pi för detta projekt? Annars kanske det vore lämpligt att byta trådnamn till ...Arduino... istället?
(Är av mest egoistiska skäl då jag är mer intresserad av Arduino än R-Pi och titeln gör att jag missar tråden ibland)
Tack :)

Rubriken får gärna ändras till samma men "Arduino UNO" istället för "Raspberry Pi".

MVH/Roger

Re: Hur använda Raspberry Pi för att sampla och lägga i data

Postat: 3 februari 2014, 23:40:32
av Spisblinkaren
Okej, nu har jag byggt en testrigg som simulerar alla mina signaler.

Till att börja med ska jag dock bara använda poten "Givare" och försöka styra servot linjärt.

Detta kräver alltså variabel-användning och A/D-omvandling.

Mha av den fantastiska Arduino-skolan ni så tacksamt tipsat mig om känner jag dock att detta inte kommer innebära några problem.

Bifogar lite bilder.

MVH/Roger

Re: Hur använda Arduino UNO för att sampla och lägga i datab

Postat: 4 februari 2014, 22:44:26
av Spisblinkaren
Nu har jag lyckats få servot att steglöst ändra position mha en potentiometer.

Tydligen motsvarar en liten pulsbredd (~500us) fullt CW, och en stor pulsbredd (~2500us) fullt CCW.

Jag noterar också att det är ett litet dödband vid båda ändlägena så pulserna bör justeras något för optimal prestanda.

Nu är det dock som så att detta bara är ett lekfullt test. Även om A/D-omvandlig är nåt jag kommer behöva göra vid skarpt läge.

Jag är mycket glad över denna framgång. Var egentligen tom enklare än mha brytare :)

Det enda jag missade var att deklarera variabeln.

MVH/Roger


Re: Hur använda Arduino UNO för att sampla och lägga i datab

Postat: 8 mars 2014, 22:32:35
av Spisblinkaren
Nu har jag lyckats programmera för polling av alla mina fyra reglage.

Tack vare min testrigg och lite hjälp från jobbet så fick jag till slut det att fungera.

Största problemet var att fatta att upprepade samplingar inte kan ge exakt samma resultat så man måste ta hänsyn till det i koden. Det var dock inte jag som kom på det utan en kär kollega (RBM).

Bifogar programmet.

MVH/Roger_
PS
Det var lite tråkigt att man inte kunde använda sig av abstraktionsnivån att man bara definierade funktioner och sedan använde dom utan att de var färdigbyggda. Det blev alltså nödvändigt att tillfäligtvis få funktionerna att göra nåt för att de sedan skulle kunna skrivas in i huvudprogrammet. Koden blev således lite extra grötig pga detta :)

Re: Hur använda Arduino UNO för att sampla och lägga i datab

Postat: 9 mars 2014, 12:49:30
av hummel
Ett C-program skrivet i Excel.:-)

Re: Hur använda Arduino UNO för att sampla och lägga i datab

Postat: 13 mars 2014, 20:51:08
av Spisblinkaren
Nja, det var mest för att jag ville visa programmet då det inte gick att kopiera koden och klistra in den i paint så jag fick gå via excel.

Men det fattade du nog :)

MVH/Roger

Re: Hur använda Arduino UNO för att sampla och lägga i datab

Postat: 13 mars 2014, 23:15:07
av sodjan
Jösses vilken omväg... :-)
Varför inte bara (kopierat från din Excel-fil):

Kod: Markera allt

/*
Poll
 */
 
//int servo=13;
//int PotValue;

// the setup routine runs once when you press reset:
void setup() {                
// initialize the digital pin as an output.
  pinMode(13, OUTPUT); 
// initialize the digital pin as an input.
// Pin 2&3 are connected to a button tied to GND with pullup 10K to VCC.
  pinMode(2, INPUT);  
  pinMode(3, INPUT);
}

int Convert_A(int Analog) {
  return 500 + 2 * Analog;
}

int Convert_D(int Digital) {
  return 500 + 2048 * Digital;
}

void runServo(int width) {
  digitalWrite(13, HIGH);
  delayMicroseconds(width);
  digitalWrite(13, LOW);
  delay(20);
}

// sensor value is converted and somehow stored to SD
int storeSensor(int AD){
  if (AD=512) return 500; // dummy
}
// holdTime value is converted and affects updating speed
int holdTime(int AD){
  if (AD=100) return 50; // dummy
}
// newUser enables new data sequence input
void newUser(){          
  int a,b;               // dummy
  a=10;
  b=a;
}
// Cal calibrates sensor to actual reference force (1kg)
void Cal(){              
  int a,b;               // dummy
  a=10;
  b=a;
}


int reg1_stat;
int reg1_dyn;
int reg2_stat;
int reg2_dyn;
int reg3_stat;
int reg3_dyn;
int reg4_stat;
int reg4_dyn;

void loop () {
  reg1_stat=analogRead(0);
  reg2_stat=analogRead(1);
  reg3_stat=digitalRead(2);
  reg4_stat=digitalRead(3);
// delays 40ms to await any knob changes.  
  delay(40); 
// abs neccesary due to sampling accuracy.  
  reg1_dyn=analogRead(0);
  if (abs(reg1_dyn-reg1_stat)>10){   
    runServo(Convert_A(reg1_dyn)); // used for debugging
    storeSensor(reg1_dyn);
  }    
  reg2_dyn=analogRead(1);
  if (abs(reg2_dyn-reg2_stat)>10){
    runServo(Convert_A(reg2_dyn)); // used for debugging
    holdTime(reg2_dyn);  
  }
  reg3_dyn=digitalRead(2);
  if (reg3_dyn != reg3_stat){
    runServo(Convert_D(reg3_dyn)); // used for debugging
    newUser();
  }
  reg4_dyn=digitalRead(3);
  if (reg4_dyn != reg4_stat){
    runServo(Convert_D(reg4_dyn)); // used for debugging
    Cal(); 
  } 
    
    
}