Problemen met een project

Goededag,

Ik moet voor school werken aan een project, heb ervoor gekozen om te werken met de Arduino Uno.

Aangezien ik nog niet zoveel van de programmeertaal weet, vraag ik op deze manier om hulp.

Heb een voorlopige code, waar nog een aantal probleempjes bij optreden. Sorry als er een paar dingen niet helemaal juist op staan, maar ben nog een beetje nieuw voor deze programmeertaal..

Als je naar het programma kijkt, zie je dat ik werk met 5 DC-motoren. Die moeten links en rechts draaien, boven en beneden en ook eentje die als grijper dient. Het gaat over een robot grijper.

Ik ben ook nog naar een oplossing aan het zoeken om met een holdkey te werken, maar dit lukt mij helaas minder goed en vlot.. Ook hiervan heb ik een voorlopig programma gevonden.

Hold key programma.txt (1.11 KB)

Zo te zien is het eerste project, het hoofdproject eraf gevallen.. Hier is het dan nog eens.

Voorlopig programma arduino.txt (5.58 KB)

Hoi Ruben.sey, welkom.

Alle begin is moeilijk, dat weet ik.

Maar ik vraag me af of je wel bij het begin begonnen bent.
Het ziet er eerder uit alsof je wat code gezocht hebt en toen bij elkaar geveegd, zonder te weten wat je nu precies allemaal te pakken hebt.

Bijvoorbeeld: waarom doe je 5 keer serial.begin (9600) ?

En wat is de bedoeling van de flag (die wel veel ruimte in beslag neemt voor wat ie zou moeten zijn) ?
Want ik zie niet wat je er mee doet.

Maar nu de grote klapper:

Wat is je probleem ?
Je vertelt dat je problemen hebt, maar niet wat die problemen zijn.
Ik denk dat je dat eerst maar eens moet aanpakken.

Commentaar dat de lading niet dekt is uitermate onbruikbaar; los dat eerst eens op. Bv

        // if the state is '3' the motor will turn up
    else if (state == '3') {
...
...
        // if the state is '3' the motor will turn up
    else if (state == '5') {
...
...

Er is ook wat commentaar dat je leven in de toekomst lastig kan maken; bv

    digitalWrite(motorPin1a, LOW); // set pin 2 on Arduino low
...
...
    digitalWrite(motorPin1a, HIGH); // set pin 2 on Arduino high

Stel je voor dat je om wat voor reden dan ook ooit die motor pinnen ergens anders moet aansluiten (bv omdat je een interrupt nodig hebt); dan met je overal je commentaar aanppassen.

Verder wil ik je adviseren om fatsoenlijke namen te gebruiken voor je motor pinnen. Bv motorPin1e en motorPin2e kunnen gemakkelijk worden veranderd naar iets dat refereert naar the claw of grijper.

Verder zal het onderstaande niet werken

    else if (state == '10') {

Je leest een (1) karakter en verwacht vervolgens dat de 'state' variabele twee karakters bevat; de syntax is ook niet helemaal kosher.

Je zult ook moeten uitleggen wat je precies met een 'hold key' wilt bereiken. Je loop() code onthoudt bv al het laatste ontvangen karakter; voor een keypad kun je vermoedelijk hetzelfde principe gebruiken.

Wil je de seriele communicatie vervangen door een keypad of moeten ze parallel werken?

Hallo,

als eerst, bedankt voor zo snel te antwoorden!
Als tweede, ik probeer een project samen te stellen zodat ik via een arduino een robot klauw can bedienen via een bluetooth module, HC-06. Er zitten zoals eerder vermeld 5 DC-motoren in. dus die moeten allemaal afzonderlijk kunnen bewegen. Mijn eerste poging was om 1 DC-motor te laten bewegen wanneer ik bv. op de knop "U" klik. Dan gaat de DC-motor bijvoorbeeld links draaien. Om hem te stoppen bv. op de knop "S". Dit heeft gewerkt. Maar nu, zoek ik een uitbreiding zodat ik die knop "S" niet meer nodig heb, m.a.w. dat ik de "U" knop blijf indrukken en dat de motor dan blijft draaien tot hij stopt. Om dit voor mekaar te krijgen dacht ik aan de hold key, heb een paar programma's opgezocht maar sommige zien er een beetje ingewikkeld uit, of het ligt aan mij.

en dan over die serialbegin(9600), ik weet enkel dat ik die nodig heb om een connectie te maken met mijn bluetooth module. Dus ik ging ervan uit dat ik die per motor opnieuw moest gebruiken. Dus ik neem nu aan dat het genoeg is dit 1 keer te doen bovenaan in het 'void loop' gedeelte?

Als je enig idee hebt om mij uit de nood te helpen, hoor ik het graag!

Ruben.sey:
en dan over die serialbegin(9600), ik weet enkel dat ik die nodig heb om een connectie te maken met mijn bluetooth module. Dus ik ging ervan uit dat ik die per motor opnieuw moest gebruiken. Dus ik neem nu aan dat het genoeg is dit 1 keer te doen bovenaan in het 'void loop' gedeelte?

Met Serial begin geef je aan dat je de Seriale communicatie wilt gebruiken met een bepaalde baud-rate, in jouw geval 9600 bits per seconde, dit hoef je maar 1x aan te geven in de 'void setup', niet in de loop.
Je bluetooth module sluit je dan gok ik aan op pin 0 en 1 van de Arduino, zodat de Arduino je Bluetooth module automatisch zal gebruiken als Seriele communicatie op die 9600 baud-rate :).

Je geeft dus niet aan dat je voor een motor serial communicatie wilt beginnen, je geeft 1x aan dat je het 'wilt' gebruiken op die baud-rate.

(verbeter me als ik iets fout zeg).

Ik hoop dat dit iets duidelijker maakt.

Hoi.

Geen idee welke HC-06 module jij hebt met knoppen "u" en "s" er op.

Zoals sterretje al zei: let op de commentaren.
Omdat je nog niet veel ervaring hebt, zullen commentaren je kunnen helpen om de code te lezen.
Maar dan moet je wel zorgen dat die commentaren kloppen.
Anders kun je ze veel beter helemaal weghalen.

Verder ben ik ook met hem eens dat de benamingen die je aan de pins voor de motoren gegeven hebt, niet erg duidelijk zijn.
Maar als je dat zelf wel begrijpt (en heel logische namen vind) dan moet je dat ook zelf weten.

serial.begin (9600) moet maar 1 maal uitgevoerd worden.
Een 2e (of meer) maal doet niets anders als kostbare tijd verspillen.

Die flag waar ik het eerder over had, die word gebruikt om wel of niet een tekst via de seriële poort te sturen, dus hij word wel degelijk gebruikt.
Wanneer er sprake is van een flag, dan maak je gebruik van een heel klein stukje geheugen (om iets te onthouden dus).
In dit geval wil je vermoedelijk ook wel gaan onthouden dat je een bepaalde toets al eens hebt gezien.
Zo'n flag kan dus een hulpmiddel zijn om bij te houden dat je al een tijdje (een heel kort tijdje...) op die knop aan het drukken bent.
Maar wat als dat drukken nu net zo snel gaat als ik hier op mijn toetsenbord zit te typen ?
Dat gaat vrij vlot (maar ik ben geen secretaresse met een paar honderd foutloze toetsaanslagen per tijdseenheid, zonder te kijken).
Dus je moet dan niet alleen onthouden dat er een toets was ingedrukt, maar ook welke toets dat dan was.
Wanneer er geen toets meer word ingedrukt, of wanneer er een andere toets word ingedrukt, dan moet je dus ook een andere actie gaan doen.

Verder is dit soort sketches ideaal om switch case toe te passen.
En ook om met functies te werken, maar noodzakelijk is dat niet.

Ik denk dat je nog wel het een en ander te bestuderen hebt voor je kunt doen wat je voor ogen hebt (en ook begrijpt wat er gebeurt).

Waarom ga je niet een flinke stap terug, en met 1 motor aan de slag.
Die ene motor laat je dan werken op de manier die je beschreven hebt.
Dus bewegen zolang er op een bepaalde knop gedrukt word.
Daarna kun je gaan werken om die motor de andere kant op te laten bewegen zolang er op een andere knop gedrukt word.
Pas als je dat voor mekaar hebt, dan kun je motoren gaan toevoegen.

MAS3:
Pas als je dat voor mekaar hebt, dan kun je motoren gaan toevoegen.

Hallo, Zoals je had voorgesteld, is hier het eerste deel van het project. Zal eerst even beschrijven wat het zou moeten doen (volgens mij):

Ben begonnen met een paar variabelen aan te maken, zodat ik onderanderen pins heb van mijn arduino, zodat hij die dan op zijn beurt hoog of laag kan maken.

In de setup heb ik de serial.begin(9600) gestopt (1 keer).
Daar geef ik ook weer dat de 2 pins die ik voorlopig gebruik, uitgangen zijn.

In de loop heb ik eerst een kleine controle voor de connectie. wanneer die groter is dan 0, kan je pas verder gaan.

Wanneer de state '0' is, worden alle uitgangen van de motor, in dit geval motorpin1a en motorpin2a LOW gezet. Op een app krijg ik dan het bericht dat de motor "off" is. M.a.w. gestopt.

Wanneer de state '1' is, blijft motorpin1a LOW en wordt motorpin2a HIGH. Ik krijg dan ook een bericht te zien dat, in dit geval de motor omhoog gaat.

Nu, om deze te doen stoppen, moet ik die '0' state weer gebruiken. Die zou ik op één of andere manier eruit willen, daar zit ik al een tijdje op te zoeken, maar weet niet hoe ik dit oplos in de code. Vandaar mijn poging met de holdkey. Wat ik met dit wil bereiken is dat ik de state '1' blijf ingedrukt houden en dat de motor dan blijft omhoog gaan. Tot ik de state '1' weer los laat. Idem voor het andere deel. (Waar de motor dan naar beneden gaat).

int motorPin1a = 3; // pin 3 on Arduino
int motorPin2a = 4; // pin 4 on Arduino

int state;
int flag=0; 

void setup() {    
  // put your setup code here, to run once:   
  // initialize serial communication at 9600 bits per second: 
  Serial.begin(9600);

    pinMode(motorPin1a, OUTPUT);
    pinMode(motorPin2a, OUTPUT);

}

void loop() {
  // put your main code here, to run repeatedly:
//if some date is sent, reads it and saves in state
    if(Serial.available() > 0){     
      state = Serial.read();   
      flag=0;
    }   
    // if the state is '0' the DC motor will turn off
    if (state == '0') {
        digitalWrite(motorPin1a, LOW); // set pin 3 on L293D low
        digitalWrite(motorPin2a, LOW); // set pin 4 on L293D low
        if(flag == 0){
        Serial.println("Motor: off");
        flag=1;
        }
    }
    // if the state is '1' the motor will turn right
    else if (state == '1') {
      do{
        digitalWrite(motorPin1a, LOW); // set pin 3 on Arduino low
        digitalWrite(motorPin2a, HIGH); // set pin 4 on Arduino high

        if(flag == 0){
        Serial.println("Motor: up");
        flag=1;
        }
        } while (state == '1');
    }
    
    // if the state is '2' the motor will turn left
    else if (state == '2') {
      do{
        digitalWrite(motorPin1a, HIGH); // set pin 3 on Arduino high
        digitalWrite(motorPin2a, LOW); // set pin 4 on Arduino low

        if(flag == 0){
          Serial.println("Motor: down");
          flag=1;
        }
        } while (state =='2');
    }
}

Moest er dus iemand zijn die een idee heeft om tot een oplossing te komen, zou ik die persoon heel dankbaar zijn!

Ruben.sey:
m.a.w. dat ik de "U" knop blijf indrukken en dat de motor dan blijft draaien tot hij stopt. Om dit voor mekaar te krijgen dacht ik aan de hold key, heb een paar programma's opgezocht maar sommige zien er een beetje ingewikkeld uit, of het ligt aan mij.

Zeer verwarrend; ten eerste onthoudt je huidige code de laatst ontvangen seriele data. Ten tweede kom je op de proppen met een stukje code voor een toetsenbord (heypad) maar dat wordt in antwoord #4 verder niet genoemd.

Ruben.sey:
Nu, om deze te doen stoppen, moet ik die '0' state weer gebruiken. Die zou ik op één of andere manier eruit willen, daar zit ik al een tijdje op te zoeken, maar weet niet hoe ik dit oplos in de code. Vandaar mijn poging met de holdkey. Wat ik met dit wil bereiken is dat ik de state '1' blijf ingedrukt houden en dat de motor dan blijft omhoog gaan. Tot ik de state '1' weer los laat. Idem voor het andere deel. (Waar de motor dan naar beneden gaat).

Aha. Dat maakt het wat logischer. Simpel de state aan het eind van je loop op 0 zetten (nul, niet '0'). Of mogelijk beter, de state variable verwijderen waar deze nu is en in loop delcareren.

void loop()
{
int state = 0;

...
...
}

Om problemen te voorkomen moet deze ge-initialiseerd worden met een waarde die geen effect heeft in je code; bv 0.

En wat je nu moet bestuderen is 'variable scope'.

Zeer verwarrend; ten eerste onthoudt je huidige code de laatst ontvangen seriele data. Ten tweede kom je op de proppen met een stukje code voor een toetsenbord (heypad) maar dat wordt in antwoord #4 verder niet genoemd.

Die bluetoothmodule, de HC-06 is te besturen via een android telefoon, vandaar dus die keypad dat ik nodig heb.

En heb je enig idee hoe ik een loop maak dan, dat hij de code niet onthoud, maar in plaats daarvan telkens opnieuw gaat inlezen?

Wat ik wil zeggen is, dat hij telkens moet blijven controleren dat ik een bepaalde knop, om de motor te laten draaien, nog steeds ingedrukt hou of niet. zo ja, blijft hij draaien, zo nee, stopt hij.

en ik verstond je niet zo goed waar je schreef, 'nul' in plaats van '0', als het met een android bestuurd wordt, lijkt het mij gemakkelijker om de motor te laten draaien wanneer je op 1 knop drukt dan een woord in te typen. In het geval dat dit niet hetgene is wat je bedoelde, sorry.

Ik ga nu eerst even een kijkje nemen naar die variable scope, weet voor de moment nog niet wat dit kan doen.

Er is een verschil tussen het nummer 0 en het karakter '0'. Check de ascii tabel.

Je hebt geen keypad nodig als je boel bestuurt met een Android; een keypad is een toetsenbordje dat je aansluit op bv. een Arduino.

En het stukje code dat ik je toonde zorgt ervoor dat de 'state' variabele 'local scope' heeft en vergeten wordt op het moment dat loop() eindigt (een paar duizend keer per seconde) en dus moet je de knop ingedrukt houden om bv de grijper te blijven bewegen.

Ach ach ach .... wat is er over gebleven van het goed zelf onderzoeken...... ik had het er vanmiddag nog over met iemand..... in min tijd bestond internet gelukkig nog niet.... dan ging je zelf op onderzoek uit net zolang tot het opgelost was... nu hebben we internet en kunnen we overal zoeken en nu moeten we overal vragen????? De grijze massa wordt lui

Nou ik vind dat dat best mee valt hoor Nico.

Het probleem is niet zozeer dat je niet meer zelf zou kunnen onderzoeken, maar meer dat wanneer je het interweb daarvoor gaat raadplegen, je veel te veel gaat vinden.
En dan is de verleiding wel erg groot om dingen die je vind en waarvan je denkt dat het misschien eventueel bruikbaar zou kunnen zijn, te gaan uitproberen.
En nog erger, delen die je gevonden hebt bij elkaar vegen en dan in de knoop raken natuurlijk.

Maar goed, weer wat meer on topic maar.

Dat hele gedoe met het keypad (hardware die je op je Arduino aansluit en software) mag dus gelijk overboord.
Het heeft niets te maken met waar OP mee bezig is.

Ruben.sey:

Je vragen zijn al beantwoord, maar jij herkent de antwoorden niet.
Lees alles nog eens een paar keer door zou ik zeggen.

nicoverduin:
Ach ach ach .... wat is er over gebleven van het goed zelf onderzoeken...... ik had het er vanmiddag nog over met iemand..... in min tijd bestond internet gelukkig nog niet.... dan ging je zelf op onderzoek uit net zolang tot het opgelost was... nu hebben we internet en kunnen we overal zoeken en nu moeten we overal vragen????? De grijze massa wordt lui

Zonder internet zou ik niet eens weten wat Arduino was of C++ haha, lijkt me vreselijk om dat allemaal in boeken te moeten opzoeken ofzo.. ben wel blij met YouTube en Google. En de forums natuurlijk :).

Tja en daar zit ook het verschil... 5x per jaar laat ik me weer teleurstellen als ik de scriptie examens doe..... als ze al een 7 halen zijn ze spekkoper..... en elk jaar wordt het minder....

MAS3:
serial.begin (9600) moet maar 1 maal uitgevoerd worden.
Een 2e (of meer) maal doet niets anders als kostbare tijd verspillen.

Dat is niet helemaal waar; het kan data corruptie veroorzaken. Ik was bezig met wat code en had per ongelijk een tweede Serial.begin() aan het eind van setup() ten gevolge van verkeerd copieren en plakken.

Na een beetje spelen de onderstande code die het gedrag demonstreert.

char buffer[64];
void setup()
{
  Serial.begin(250000);

  char data[] = "abc";
  sprintf(buffer, "%p", data);
  Serial.println("OOPS");

  sprintf(buffer, "%p", data);
  Serial.println("Hi"); 
  
  Serial.begin(250000);
  Serial.println("hallo");
}

void loop()
{
}

Het resultaat (in Serial Monitor)

OOPS
¤ZC!+±±½5

kijk eens hoe case werkt, dat maakt je code duidelijker, kijk eens naar alle typefouten en dubbele dingen.
kijk wat er binnen komt op je hsc en print dat eerst maar eens.
en dan kom je weer hiernaartoe.