Styra ett RC-fartreglage

Robot, CNC, Pneumatik, Hydraulik, mm
ie
EF Sponsor
Inlägg: 1276
Blev medlem: 23 oktober 2006, 13:12:57
Ort: Tyresö

Re: Styra ett RC-fartreglage

Inlägg av ie »

Vet inte riktigt om jag förstått hur du vill ha det, men som koden ser ut nu så...

När den startar är brytare 1 hög varvid den fastnar i While-satsen.
När brytare 1 trycks in så lossnar den och sätter servot till 50.
Sen kan två saker hända
1 - Du släppar knappen varvid den fastnar i While-loopen igen, eller
2 - Du trycket samtidigt in brytare 2, varvid sevot går till 0
När knapparna släpps så fastnar du i While-loopen och du är tillbaka till startläget.

Är det meningen att du ska trycka på båda samtidigt?

Personligen tycker jag ofta att sånt här är lättast att koda som en sk state-maskin. Dvs du har ett antal väldefinierade lägen och tydliga regler hur du gå mellan dessa. Kan t ex se ut så här:

State 0: Kolla om brytare 1 har tryckts, i så fall sätt servo till 50 och gå till state 1
State 1: Kolla om brytare 1 har släppts, i så fall gå till state 2
State 2: Kolla om brytare 1 har tryckts, i så fall sätt servo till 0 och gå till state 3
Kolla om brytare 2 har tryckts, i så fall gå till state 4
State 3: Kolla om brytare 1 har släppts, i så fall gå till state 0
State 4: Kolla om brytare 1 har tryckts, i så fall sätt servo till 0 gå till state 3
Sätt servo till 100
Vänta
Sätt servo till 150
Vänta

Ovanstående kod loopas igenom i evighet, varvid state 4 upprepas automatiskt tills brytare 1 har tryckts.

Det kan också ev behövas någon debounce i koden.

I ditt fall kan det säkert lösas enklare, men metoden ovan är ganska enkel att felsöka och även att modifiera eller utöka. T ex kan man skriva ut i vilken ordning de olika state'n utföres för att se att det funkar som tänkt.
vintage
Inlägg: 23
Blev medlem: 31 mars 2012, 15:58:07

Re: Styra ett RC-fartreglage

Inlägg av vintage »

Hej igen, ytterligare en helkväll i Arduinoträsket med en icke så förstående sambo,men kul är det. :wink:

Jag har en inpulsknapp för ON/OFF (första trycket: ON, servot går till 50 + dioden tänds. Andra trycket :OFF, servot går till 0 + dioden släcks.) Sen har jag brytare 2, om den blir påverkad när jag är i läge ON skall den få servot att börja pulsa mellan 100-150. Men om jag är i läge OFF skall den inte påverka servot. Och om jag är i läge ON och brytare 2 är aktiv och servot pulsar ska servot gå till läge 0 + dioden släckas om jag trycker på inpulsknappen ON/OFF. Jag får till inpulsfunktionen, alltså jag kan få servot att gå till 50 + dioden tänds vid första trycket och få servot att återgår till 0 + dioden släcks vid andra trycket. Men sen tar det stopp.
Sen är jag helt ny på att programera så jag fattar inte hur jag skall få till koden för en state-maskin. Någon som kan hjälpa mig med att visa hur man lägger upp koden med de olika funktionerna och rätta komandord.

/Petter
ie
EF Sponsor
Inlägg: 1276
Blev medlem: 23 oktober 2006, 13:12:57
Ort: Tyresö

Re: Styra ett RC-fartreglage

Inlägg av ie »

Grunden till en state-maskin kan se ut så här...

Kod: Markera allt

state = 0
while(1)
{
     switch(state)
     {
          case 0:  // Vänta på att knapp 1 ska tryckas
          {
               if (digitalRead(2) == HIGH)
               {
                    digitalWrite (13, 1);  // Tänd lysdiod
                    ms.write(50);  // Gå till pos 50
                    state = 1;  // Vänta på att knappen släpps
               }
               break;
          }
          case 1:  // Vänta på att knapp 1 ska släppas
          {
               if (digitalRead(2) == LOW)
               {
                    state = 2;  // Knappen släppt, vänta på nästa knapptryckning i state 2
               }
               break;
          }
          case 2:  // Vänta på att knapp 1 eller 2 ska tryckas
          {
               ...
               break;
          }
          osv...
     }
}
Sen fyller du på med koden som behövs. I princip de instruktioner du använt i ditt exempel, dvs läsa input, styra servo och lysdiod, samt att sätta vilket nästa state ska vara.

Sen är det bara att tänka efter vilka lägen din maskin kan befinna sig i. State 0 är t ex när du väntar på "fösta trycket". I mitt exempel la jag in extra state's som kollar att knappen släpps innan den går vidare och väntar på nästa tryckning.

Kan behövas en liten delay efter varje knapptryckning/släpp för att ta bort ev studs.
vintage
Inlägg: 23
Blev medlem: 31 mars 2012, 15:58:07

Re: Styra ett RC-fartreglage

Inlägg av vintage »

Hej igen, nu har jag försökt med den nya koden men det vill inte funka jag kan inte ladda ner den till UNO;n.
Så här ser min kod ut

/Petter

#include <Servo.h>
Servo ms;



void setup()
{
pinMode(13, OUTPUT);
pinMode(2, INPUT);
pinMode(3, INPUT);
ms.attach(9);
ms.write(0);
}

void loop()
state = 0
while(1)
{
switch(state)
{
case 0: // Vänta på att knapp 1 ska tryckas
{
if (digitalRead(2) == HIGH)
{
digitalWrite (13, 1); // Tänd lysdiod
ms.write(50); // Gå till pos 50
state = 1; // Vänta på att knappen släpps
}
break;
}
case 1: // Vänta på att knapp 1 ska släppas
{
if (digitalRead(2) == LOW)
{
state = 2; // Knappen släppt, vänta på nästa knapptryckning i state 2
}
break;
}
case 2: // Vänta på att knapp 1 eller 2 ska tryckas
{
if (digitalRead(2) == HIGH);
delay(100);
{
state = 0;
}
if (digitalRead(3) == HIGH); // Servo börjar pulsa
delay(100);
{
ms.write(100);
delay(2000);
ms.write(150);
delay(2000);
state = 3;
}
break;
}
case 3; //Vänta på att knapp 1 ska tryckas
{

if(digitalRead(2) == HIGH);
delay(100);
{
state = 0;
}
break;
}

}
}
vintage
Inlägg: 23
Blev medlem: 31 mars 2012, 15:58:07

Re: Styra ett RC-fartreglage

Inlägg av vintage »

 #include <Servo.h>
Servo ms;



void setup()
{
  pinMode(13, OUTPUT);
  pinMode(2, INPUT);
  pinMode(3, INPUT);
  ms.attach(9);
  ms.write(0);
}

void loop()
state = 0
while(1)
{
     switch(state)
     {
          case 0: // Vänta på att knapp 1 ska tryckas
          {
               if (digitalRead(2) == HIGH)
               {
                    digitalWrite (13, 1); // Tänd lysdiod
                    ms.write(50); // Gå till pos 50
                    state = 1;  // Vänta på att knappen släpps
               }
               break;
          }
          case 1: // Vänta på att knapp 1 ska släppas
          {
               if (digitalRead(2) == LOW)
               {
                    state = 2;  // Knappen släppt, vänta på nästa knapptryckning i state 2
               }
               break;
          }
          case 2: // Vänta på att knapp 1 eller 2 ska tryckas
          {
               if (digitalRead(2) == HIGH);
               delay(100);
               {
               state = 0;
               }
               if (digitalRead(3) == HIGH); // Servo börjar pulsa
               delay(100);
               {
                 ms.write(100);
                 delay(2000);
                 ms.write(150);
                 delay(2000);
                 state = 3;
               }
               break;
          }
          case 3; //Vänta på att knapp 1 ska tryckas
          {
            
              if(digitalRead(2) == HIGH);
              delay(100);
              {
                state = 0;
              }
              break;
          }
          
     }
}
ie
EF Sponsor
Inlägg: 1276
Blev medlem: 23 oktober 2006, 13:12:57
Ort: Tyresö

Re: Styra ett RC-fartreglage

Inlägg av ie »

Det fattas lite måsvingar och vissa är på fel ställen...

Har inte testat detta, men borde inte vara så långt ifrån.

Kod: Markera allt

 #include <Servo.h>
Servo ms;

void setup()
{
	pinMode(13, OUTPUT);
	pinMode(2, INPUT);
	pinMode(3, INPUT);
	ms.attach(9);
	ms.write(0);
}

void loop()
{
	state = 0;
	while(1)
	{
		switch(state)
 		{
			case 0: // Vänta på att knapp 1 ska tryckas
			{
				if (digitalRead(2) == HIGH)
				{
					digitalWrite (13, 1); // Tänd lysdiod
					ms.write(50); // Gå till pos 50
					delay(100);
					state = 1; // Vänta på att knappen släpps
 				}
				break;
 			}
			case 1: // Vänta på att knapp 1 ska släppas
			{
				if (digitalRead(2) == LOW)
 				{
					delay(100);
					state = 2; // Knappen släppt, vänta på nästa knapptryckning i state 2
				}
				break;
 			}
			case 2: // Vänta på att knapp 1 eller 2 ska tryckas
			{
				if (digitalRead(2) == HIGH);
				{
					delay(100);
					state = 10; // Avsluta
				}
				if (digitalRead(3) == HIGH); // Servo börjar pulsa
				{
					state = 3; // Första puls
				}
				break;
			}
			case 3; //Första pulsläget
			{
 				if(digitalRead(2) == HIGH);
				{
					delay(100);
					state = 10;
				}
				else
				{
					ms.write(100);
					delay(2000);
					state = 4;
				}
				break;
			}
			case 4; //Andra pulsläget
			{
 				if(digitalRead(2) == HIGH);
				{
					delay(100);
					state = 10;
				}
				else
				{
					ms.write(150);
					delay(2000);
					state = 3;
				}
				break;
			}
			case 10; //Avsluta
			{
				digitalWrite (13, 0); // Släcklysdiod
				ms.write(0); // Gå till pos 0
				state = 11;
				break;
			}
			case 11: // Vänta på att knapp 1 ska släppas
			{
				if (digitalRead(2) == LOW)
 				{
					delay(100);
					state = 0; // Knappen släppt, vänta på nästa knapptryckning i state 2
				}
				break;
 			}
		}
	}
}
Användarvisningsbild
adent
Inlägg: 4103
Blev medlem: 27 november 2008, 22:56:23
Ort: Utanför Jönköping
Kontakt:

Re: Styra ett RC-fartreglage

Inlägg av adent »

Stiligt, det värmer mitt hjärta! :)

Kolla in de här raderna:

Kod: Markera allt

               if (digitalRead(2) == HIGH);
               delay(100);
               {
                  state = 0;
               }
; efter if-satsen betyder om sant gör ingenting. Det är sällan eller aldrig man vill att det ska stå så, men vill man
det brukar man skriva:

Kod: Markera allt

               if (digitalRead(2) == HIGH)
                           ;
För att det ska vara tydligt att se. Men jag tror du vill ta bort ; och stoppa in delayen innanför måsvingarna {}
så kommer du närmare :)

Det är nu du börjar lära dig att i C så är det helt ok att skjuta sig i foten, C gör som du säger och struntar i om
det är knasigt eller inte :)

MVH: Mikael

Edit: I IE's kod ovan är ; kvar på en del ställen efter if-satser, farligt! då körs ALLTID koden innanför {}.
ie
EF Sponsor
Inlägg: 1276
Blev medlem: 23 oktober 2006, 13:12:57
Ort: Tyresö

Re: Styra ett RC-fartreglage

Inlägg av ie »

Edit: I IE's kod ovan är ; kvar på en del ställen efter if-satser, farligt! då körs ALLTID koden innanför {}.
Tack, det missade jag :)
vintage
Inlägg: 23
Blev medlem: 31 mars 2012, 15:58:07

Re: Styra ett RC-fartreglage

Inlägg av vintage »

Tack för all hjälp,
Det krävdes "int state = 0" efter void loop(). Sen fick jag ta bort en del ; och byta ut några ; mot : men efter det funkade det bra.

/Petter
ie
EF Sponsor
Inlägg: 1276
Blev medlem: 23 oktober 2006, 13:12:57
Ort: Tyresö

Re: Styra ett RC-fartreglage

Inlägg av ie »

Kanon! Då visar du att du börjat läsa och förstå koden. Då kommer det att gå mycket lättare sen...
Skriv svar