Go Down

Topic: Hjälp med Servomotor och fotocell! If else satser (Read 2512 times) previous topic - next topic

hannisw

Hej!

Jag skulle verkligen behöva hjälp med en grej! Tanken för mig är att servomotorn inte ska röra sig då den inte är påverkad av fotocellen och när den blir påverkad ska den röra sig.

Jag vet vad jag vill men vet inte hur jag får till det!
Har kollat på en massa turtorial och har gjort en massa också. Som när det bli mörkt så går servon olika lång beroende på hur mörkt det blir.

Det jag söker är en if else sats och hur den skulle se ut för servon i första läget att inte röra sig då den inte är påverkad och i andra läget ska den röra sig och sedan gå tillbaka till sin tidigare position och då börjar det om igen  :)

Hoppas ni förstår och tack på förhand till er, håller på bli galen!
Lite begränsad fortfarande i mina kodningar ;)

mvh

3dprinter

Hej. Bare lungn.

"När den är påverkat" - jag vet inte rigtigt vad du menar med det. Så lägg up din kod så ser vi hur långt du har kommet. (Läs intro'en i forum om hur du gjör det med code tags)

Du har något som läser en fotocell, och det låter jo bra att du kan göra servo ställingen proportional med ljuset.

Oftast går det bättre när man skal forklare problemet i många små steg, - som du jo nästan skal göra här så vi vet vad du vil göra. Om stegen är små nog, så ser du hur koden skal bete sig.

Någet i den her stil:
Om servo står i start läge   // läsa fra servo er sidsta kommando - inte var den faktisk står
  Om ljuset är större end x
     Ny servo ställing
Annars sätt servo til start
Code: [Select]
if ( servo.read()==45)
  { if ( analogRead(4)>500 )
    servo.write(120) ;
  }
 else servo.write(45) ;
 


Om det här kör i loop() så vil den i et par mikro sekunder flytta sig til den nya ställing, inden loop() börjar igen og nu läser den jo at den inte er i start og shickar den tilbaka. Jeg gissar at dit problem liknar noget af det här. Så du skal vänta efter servo.write()...

Där är också två if/then (="om") och til vilken hör else til (="annars")? Det löser du med paranteser { }

Mera kan jag inte skriva til jag vet mere om dit problem och präcis vad du vil göra


hannisw

Hej! Här har jag försökt gjort en if sats där om jag väljer "kaffe" så ska servon gå till ett visst håll och om jag slår "Tassimo" så går den åt ett annat håll.

Koden ser ni här men får den inte att funka. Vad gör jag för fel??

Sen skulle jag vilja lägga till när jag får det att funka att den går tillbaka till frågan igen att jag ska säga kaffe eller Tassimo :)


Tack på förhand :)



såhär står det om error:  >:(

sketch_apr03a.ino:40:24: error: cannot convert 'Servo' to 'uint8_t {aka unsigned char}' for argument '1' to 'void analogWrite(uint8_t, int)'




Här är koden:



#include <Servo.h>

String program;

Servo myservo; //servon

int pos = 0;

void setup() {
  myservo.attach(7);
  Serial.begin(9600);
}

void loop() {
 
  Serial.println("säg ett program(Kaffe eller Tassimo");
  while (Serial.available()==0) { //medans den väntat på svar så händer inget
  }
 
  program = Serial.readString(); //läs från porten
 
  if (program=="Tassimo") {
   
    analogWrite(myservo); //slår på servon1
      myservo.write(160);
      delay(3000);
      myservo.write(20);
      delay(2500);
 
      myservo.write(160);
      delay(1000);
      myservo.write(20);
      delay(4000);
      for(;;){/*empty*/}
   
  }
 
    if (program=="Kaffe") {
   
    analogWrite(myservo); //slår på servon1
   
      myservo.write(140);
      delay(3000);
      myservo.write(50);
      delay(2500);
 
      myservo.write(160);
      delay(1000);
      myservo.write(20);
      delay(4000);
      for(;;){/*empty*/}
 
  }
 
  if ( program != "Kaffe" && program != "Tassimo") {
   
  Serial.println("");
  Serial.println("Finns inget sånt program, prova igen");
  Serial.println("");
  }
}

hannisw

Nu har jag fått koden att funka med inte att servon rör sig. Även fast jag skriver in kaffe så tror den att det är fel..

vad kan ha hänt nu?



#include <Servo.h>

String program;

Servo myservo; //servon

int pos = 0;

void setup() {
  myservo.attach(7);
  Serial.begin(9600);
}

void loop() {
 
  Serial.println("Sag ett program (kaffe eller tassimo)");
  while (Serial.available()==0) { //medans den väntat på svar så händer inget
  }
 
  program = Serial.readString(); //läs från porten
 
  if (program=="kaffe") {
   
      myservo.write(160);
      delay(3000);
      myservo.write(20);
      delay(2500);
 
      myservo.write(160);
      delay(1000);
      myservo.write(20);
      delay(4000);
      for(;;){/*empty*/}
   
  }
 
    if (program=="tassimo") {
   
      myservo.write(140);
      delay(3000);
      myservo.write(50);
      delay(2500);
 
      myservo.write(160);
      delay(1000);
      myservo.write(20);
      delay(4000);
      for(;;){/*empty*/}
 
  }
 
  if ( program != "kaffe" && program != "tassimo") {
   
  Serial.println("");
  Serial.println("Finns inget sadant program, prova igen");
  Serial.println("");
  }
}

3dprinter

Jeg har svårt at läsa som du kan se at der er smileys osv i din kod, därfor du inte har sat i "kode". Se http://forum.arduino.cc/index.php/topic,148850.0.html punkt 7.

Första eksempel:
Code: [Select]
analogWrite(myservo); //slår på servon1
Vad skal det betyda? Var har du hittat at det skal skrivas? "analogWrite" skal ha et pin nummer for at skapa ett pseudo-analog-signal - det har ingenting att göra med en servo. Därfor får du felmeddalnet.

Andra eksempel
Jag använder aldrig readString, så jag vet inte hur den betär sig. Men pröv att sätta
Code: [Select]
println(program) ;
efter din read for att se om du har läst det du tror du skal ha.

hannisw

Nu kommer jag till att den är godkänd att programmet tar det. Problemet nu är att om jag skriver så hittar inte programmet typ kaffe eller tassimo. IF satsen om jag väljer den borde göra det momentet för servon. Vad kan jag ha gjort fel? vad ska jag ändra i koden?

Skulle verkligen uppskatta om någon såg vad som missades i koden..
Vill ju att om jag skriver något av de där påstående så ska servon göra de där slagen

Quote
#include <Servo.h>
Servo myservo; //servon
int servoPin=7;
String program;

void setup() {
  myservo.attach(7);
  Serial.begin(9600);
  pinMode(servoPin, OUTPUT);
}

void loop() {
 
  Serial.println("Sag ett program (kaffe eller tassimo)");
  while (Serial.available()==0) { //medans den väntat på svar så händer inget
  }
 
  program = Serial.readString(); //läs från porten
 
  if (program=="kaffe") {
     
      myservo.write(160);
      delay(3000);
      myservo.write(20);
      delay(2500);
 
      myservo.write(160);
      delay(1000);
      myservo.write(20);
      delay(4000);
      for(;;){/*empty*/}
   
  }
 
    if (program=="tassimo") {
   
      myservo.write(140);
      delay(3000);
      myservo.write(50);
      delay(2500);
 
      myservo.write(160);
      delay(1000);
      myservo.write(20);
      delay(4000);
      for(;;){/*empty*/}
 
  }
 
    if ( program != "kaffe" && program != "tassimo") {
   
  Serial.println("");
  Serial.println("Finns inget sadant program, prova igen");
  Serial.println("");
  }
}


3dprinter

N¨r du skriver en post, så kan du använda Preview knappen for at se om det er formatteret rigtigt. Du har inte gjort som beskrevet med "kode-tag". Det kan betyde att din kode inte blir vist rigtigt.

Code: [Select]
program = Serial.readString(); //läs från porten
 
  if (program=="kaffe") {
     

ändre till
Code: [Select]
program = Serial.readString(); //läs från porten
println(program) ;
  if (program=="kaffe") {
     
och se om inneholet af "Program" är som du tror det är. ("kaffe" är inte samme som "Kaffe")

hannisw

Såg det nu! Tack för det :)

Jag får fortfarande inte till det, jag prova byta men det går inte.. tror jag snart blir knäpp :P

Msqure, du verkar vara duktig på detta med programmering, vad ska jag göra för att kunna köra programmet och inte. Skulle du kunna byta ut kodningen jag gjort som är fel. Det mesta borde vara rätt, bara att jag inte fattar, har suttit väääldigt många timmar och försöker omformatera if satser till min mening men jag kopplar det inte, dum som man är :P

mvh och tack för att du hjälper :)

3dprinter

OK, jag lagde ditt program i min Arduino og byttede myservo med Serial.print och det funkar fint.

Men hur matar du Serial? Från SerialMonitor? Om den står til "LineReturn eller andat end "NoLineEnding" så tilfogar den "carraigeReturn" til texten så Arduinoen modtager "kaffe<CR>" och det matcher inte "kaffe" -utan <CR>

Om du använder andat f.ex. Putty, så kör den igång efter första bogstaven+1sekund - läs http://www.arduino.cc/en/Serial/SetTimeout

hannisw

Kan du skicka koden som du hade och funka? jag byte men fick inte till det :S
måste vara trötter ^^

3dprinter

Det är dit program, jag använde, så du har det redan. Det enaste jag byte var alle servo.write til en enkel Serial.print("K valgt") og "T valgt" så jag kunne se at den valgde den rigtiga "if".

Det jag frågar är hur du mater ind tecken til Serial - derfor att om din SerialMonitor tilfogar et CR eller LF så passar inte din program=="kaffe". Eller om du använder något annat så skal den vare färdig på 1 sekund for at det är sådan Serial.readString funkar. Och tidligare har jag bet dig om at tilfoga et Serial.print(program) efter din Serial.readSerial så du kan se vad du har läst.

Go Up