hulp gevraagd! hand volgende robot

Als U een gezamenlijk project wil starten of aan projecten van anderen mee wilt werken.
Berichten: 4
Geregistreerd: 19 Nov 2017, 21:25

hulp gevraagd! hand volgende robot

Berichtdoor thijsvandijk » 19 Nov 2017, 21:46

Beste forum genootjes,

Ik ben Thijs en ik werk aan een project voor school.
Het idee is om een robot te bouwen die je hand kan volgen.
Ik wilde dit doen door middel van een Pan Tilt met 2 servo`s en 3 ultrasonische sensoren.
Ik was nu nog aan het werken met 2 ultrasonische sensoren om ervoor te zorgen dat de robot mijn hand kan volgen over de horizontale richting.
Momenteel gebruik ik deze code maar de robot werkt nog niet zo goed hij reageert best traag. Hebben jullie misschien nog tips?
Ik ben nog vrij nieuw met coderen dus alvast sorry als het een beetje amateuristisch is.
#include <Servo.h>

int triggerR = 2;
int echoR = 3;
int triggerL = 4;
int echoL = 5;

int durationL;
int distanceL;
int durationR;
int distanceR;

Servo x;
Servo y;
int pos = 100;

void setup() {
pinMode(triggerR, OUTPUT);
pinMode(echoR, INPUT);
pinMode(triggerL, OUTPUT);
pinMode(echoL, INPUT);
x.attach(9);
y.attach(6);
Serial.begin(9600);
}
void loop() {
//ultrasonic sensor 1
digitalWrite(triggerR, HIGH);
delayMicroseconds(50);
digitalWrite(triggerR, LOW);

durationR = pulseIn(echoR, HIGH);
distanceR = durationR*0.034/2;

if (distanceR >= 80)
{
distanceR = 80;
}
if (distanceR <= 0)
{
distanceR = 0;
}

// ultrasonic sensor 2

digitalWrite(triggerL, HIGH);
delayMicroseconds(50);
digitalWrite(triggerL, LOW);
durationL = pulseIn(echoL, HIGH);
distanceL = durationL*0.034/2;

if (distanceL >= 80)
{
distanceL = 80;
}
if (distanceL <= 0)
{
distanceL = 0;
}
x.write (pos);

delay(15);
if (distanceL > distanceR)
{
pos = pos + 10;
}
if (distanceL < distanceR)
{
pos = pos - 10;
}
if (pos > 160)
{
pos = 160;
}
if (pos < 0)
{
pos = 0;
}
}

Advertisement

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: hulp gevraagd! hand volgende robot

Berichtdoor Koepel » 20 Nov 2017, 13:27

Voor amateuristische code valt het nog mee ;)

Er zijn eenvoudige sensors voor handbewegingen: https://www.adafruit.com/product/3595.

Met ultrasone sensoren zal niet meevallen, die reageren overal op.

Je hebt al een Serial.begin(9600); in setup(). Dus je kunt in de loop Serial.println(distanceL) doen en op die manier een paar waarden naar de seriële monitor sturen.

Zou je x.write (pos); ná het berekenen van pos willen doen? Dat lijkt mij logischer.

Zou je delay(15); helemaal onderaan in de loop() willen zetten. Dat is logischer. Die delay is om de sketch iets te vertragen. Volgens mij is 15 ms een prima waarde.

Het sneller maken, dat weet ik nog niet. Ik vraag me af of je constante gegevens binnen krijgt, of dat die alle kanten op gaan.

En natuurlijk je sketch opwaarderen door hier en daar wat commentaar toe te voegen :geek:

Wanneer je code op dit forum laat zien, dan zijn er twee mogelijkheden. De knop "Code" voor code tags, of "Select a Syntax" en dan "C++".

Berichten: 4
Geregistreerd: 19 Nov 2017, 21:25

Re: hulp gevraagd! hand volgende robot

Berichtdoor thijsvandijk » 20 Nov 2017, 14:33

beste koepel,

Zouden deze sensoren dan beter werken dan ultrasonische en waar kan ik dan vinden hoe de code daarbij zou werken? En weet je toevallig ook een nederlandse webshop waar ik die dan zou kunnen kopen zodat ik niet te lang hoef te wachten op de levertijd?[code2=][/code2]
Ook heb ik de code aangepast en er commentaar bij gezet zodat het misschien wat beter te begrijpen is wat ik overal bij dacht en wat overal de bedoeling bij is.
Ik snap nog niet helemaal wat je bedoeld met "Je hebt al een Serial.begin(9600); in setup(). Dus je kunt in de loop Serial.println(distanceL) doen en op die manier een paar waarden naar de seriële monitor sturen."
Ik ben vrij onbekend met de Serial.beging() command.


[
Code: Alles selecteren
#include <Servo.h>

int triggerR = 2; // de ultrasone sensors met hun bijbehorende poorten
int echoR    = 3;
int triggerL = 4;
int echoL    = 5;

int durationL;    // variabele om de afstand en de tijd van de linker ultrasone sensor te meten
int distanceL;
int durationR;    //variabele om de afstand en de tijd van de rechter ultrasone sensor te meten
int distanceR;

Servo x;        // de motor die de pan-tilt over de horizontale as laat bewegen

int pos = 100;  // start positie uit deze positie kijkt de pan tilt recht naar voren

void setup() {
pinMode(triggerR, OUTPUT);        //output en input van us sensoren
pinMode(echoR,    INPUT);
pinMode(triggerL, OUTPUT);
pinMode(echoL,    INPUT);
x.attach(9);                      // de servo zit op in poort 9

Serial.begin(9600);
}
void loop() {
 
//ultrasonic sensor rechts
digitalWrite(triggerR, HIGH);
delayMicroseconds(50);
digitalWrite(triggerR, LOW);

durationR = pulseIn(echoR, HIGH);
distanceR = durationR*0.034/2;

if (distanceR >= 20)    // deze loop zorgt ervoor dat de afstand niet groter kan worden dan 20 cm
{
  distanceR = 20;
  }
if (distanceR <= 0)     // deze loop zorgt ervoor dat de afstand niet kleiner kan worden dan 0 cm ik had affentoe dat de sensoren negatief waarden aangavan
{
  distanceR = 0;
  }

// ultrasonic sensor links
digitalWrite(triggerL, HIGH);
delayMicroseconds(50);
digitalWrite(triggerL, LOW);
durationL = pulseIn(echoL, HIGH);
distanceL = durationL*0.034/2;

if (distanceL >= 20)        // deze loop zorgt ervoor dat de afstand niet groter kan worden dan 20
{
  distanceL = 20;
  }
if (distanceL <= 0)         // deze loop laat de afstand niet kleiner worden dan 0
{
  distanceL = 0;
  }


//de servo       
 
if (distanceL > distanceR)  // als de afstand van de linker sensor groter is dan de rechter ga naar rechts
{
  pos = pos + 10;
  }
if (distanceL < distanceR)  // als de afstand van de rechter sensor groter is dan de linker ga naar links
{
  pos = pos - 10;
  }
if (pos > 160)              // laat de positie niet groter worden dan 160
{
  pos = 160;
  }
if (pos < 0)                // laat de positie niet kleiner worden dan 0
{
pos = 0;
}
x.write (pos);     


delay(15);       
}

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: hulp gevraagd! hand volgende robot

Berichtdoor Koepel » 20 Nov 2017, 16:51

Ja, ja, de sketch gaat vooruit ;)

Je zou helemaal bovenaan commentaar kunnen zetten waar de sketch voor is, de datum, welk Arduino board, en meer van dat soort dingen.
De functies setup() en loop() springen er niet uit. Wanneer je boven een functie een lege regel doet, en de code binnen de functie inspringt, dan wordt het gemakkelijker om de code te lezen. Je mag ook in de Arduino IDE op Ctrl+T drukken voor automatisch herschikken van de tekst.

Om de seriële monitor te proberen is het misschien beter om een tweede sketch te maken.
Dit is de Arduino referentie: https://www.arduino.cc/reference/en/language/functions/communication/serial/.

In de Arduino IDE (het programma op je computer, de ontwikkelomgeving) zit een soort van vergrootglas-knopje rechtsboven. Daarmee open je de seriële monitor.
Er zijn ook voorbeelden, zoals 01. Basic: AnalogReadSerial.

Omdat er geen debugger is, zit er niet anders op dan de seriële monitor te gebruiken en daar naar toe te schrijven wat er gebeurt in de sketch.

Start met Serial.begin(9600); en druk iets af met Serial.println("Hallo");

Als dat werkt, dan kun je in je sketch de afstanden en de 'pos' afdrukken. En dan op een manier dat je weet welk getal bij welke variabele hoort natuurlijk.

Berichten: 4
Geregistreerd: 19 Nov 2017, 21:25

Re: hulp gevraagd! hand volgende robot

Berichtdoor thijsvandijk » 20 Nov 2017, 20:53

Beste koepel,

Het programma werkt al stukken beter ik heb wat dingetjes veranderd en ook je advies opgevolgd.
Ik heb de Serial.printlin () toegevoegd en ben erachter gekomen dat de sesnoren heel vaak onverwachte nullen geven
Ik heb vervolgens de for loop die ervoor zorgde dat de distance niet kleiner kon zijn dan 0 weggehaald en ben er nu achter gekomen dat de sensoren
nu onverwacht steeds super grote negatieve waarde geven (-408, -468 enz.). Zou je weten hoe dit komt?
Dit is de code die ik nu gebruik
Code: Alles selecteren
// sketch voor pan-tilt die de bewegingen van een hand volgt over de horizontale as
// gebruikt een arduino uno, 2 ultrasonic sensors en een pan tilt met een servo.
#include <Servo.h>

int triggerR = 2; // de ultrasone sensors met hun bijbehorende poorten
int echoR    = 3;
int triggerL = 4;
int echoL    = 5;

int durationL;    // variabele om de afstand en de tijd van de linker ultrasone sensor te meten
int distanceL;
int durationR;    //variabele om de afstand en de tijd van de rechter ultrasone sensor te meten
int distanceR;

Servo x;        // de motor die de pan-tilt over de horizontale as laat bewegen

int pos = 100;  // start positie uit deze positie kijkt de pan tilt recht naar voren

void setup() {
  pinMode(triggerR, OUTPUT);        //output en input van us sensoren
  pinMode(echoR,    INPUT);
  pinMode(triggerL, OUTPUT);
  pinMode(echoL,    INPUT);
  x.attach(9);                      // de servo zit op in poort 9

  Serial.begin(9600);
}
void loop() {

  //ultrasonic sensor rechts
  digitalWrite(triggerR, HIGH);
  delayMicroseconds(50);
  digitalWrite(triggerR, LOW);

  durationR = pulseIn(echoR, HIGH);
  distanceR = durationR * 0.034 / 2;

  if (distanceR >= 20)    // deze loop zorgt ervoor dat de afstand niet groter kan worden dan 20 cm
  {
    distanceR = 20;
  }


  // ultrasonic sensor links
  digitalWrite(triggerL, HIGH);
  delayMicroseconds(50);
  digitalWrite(triggerL, LOW);
  durationL = pulseIn(echoL, HIGH);
  distanceL = durationL * 0.034 / 2;

  if (distanceL >= 20)        // deze loop zorgt ervoor dat de afstand niet groter kan worden dan 20
  {
    distanceL = 20;
  }


  //de servo

  if (distanceL > distanceR)  // als de afstand van de linker sensor groter is dan de rechter ga naar rechts
  {
    pos = pos + 5;
  }
  if (distanceL < distanceR)  // als de afstand van de rechter sensor groter is dan de linker ga naar links
  {
    pos = pos - 5;
  }
  if (pos > 160)              // laat de positie niet groter worden dan 160
  {
    pos = 160;
  }
  if (pos < 40)                // laat de positie niet kleiner worden dan 40
  {
    pos = 40;
  }


  x.write (pos);
  Serial.println("distanceL");
  Serial.println(distanceL);
  Serial.println("distanceR");
  Serial.println(distanceR);

   
  delay(2000);
}

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: hulp gevraagd! hand volgende robot

Berichtdoor Koepel » 20 Nov 2017, 22:39

Nee, sorry, ik weet niet waar die rare waarden vandaan komen. Ik hen nog nooit een ultrasone sensor geprobeerd. En als ik er eentje zou proberen, dan zou ik de NewPing library gebruiken.

Ik vermoed dat de waardie die PulseIn terug geeft, over de maximale waarde voor een integer heen schiet.
https://www.arduino.cc/en/Reference.PulseIn
Je kunt 'unsigned long' gebruiken, want dat geeft PulseIn terug. Of je kunt een timeout instellen voor PulseIn.
Waar heb je die voorbeeld code gevonden ? Ik zie geen enkel voorbeeld waarbij een integer gebruikt wordt.

Ik bedoel dus deze vier:
Code: Alles selecteren
int durationL;    // variabele om de afstand en de tijd van de linker ultrasone sensor te meten
int distanceL;
int durationR;    //variabele om de afstand en de tijd van de rechter ultrasone sensor te meten
int distanceR;

Probeer eens vier keer 'unsigned long' in plaats van 'int' en kijk wat het doet.

De APDS9960 is een 3.3V sensor. Heb je een Arduino Uno ? Dan kun je beter een I2C level shifter gebruiken of een module die ook geschikt is voor 5V.
In Nederland kun je die sensor op verschillende plaatsen kopen. Google maar met site:nl apds9960
Tinytronics ken ik niet, maar ze hebben hem wel met level shifter: https://www.tinytronics.nl/shop/nl/sensoren/optisch/robotdyn-apds-9960-gesture-detectie-module

Wist je dat je een vast getal het keyword 'const' kunt geven. Dat maakt verder niet uit, het is alleen maar aardig zijn voor de compiler, zeg maar.
Code: Alles selecteren
const int triggerR = 2; // de ultrasone sensors met hun bijbehorende poorten
const int echoR    = 3;
const int triggerL = 4;
const int echoL    = 5;

Berichten: 4
Geregistreerd: 19 Nov 2017, 21:25

Re: hulp gevraagd! hand volgende robot

Berichtdoor thijsvandijk » 21 Nov 2017, 12:29

De robot werkt al veel beter ik snap nog niet helemaal wat precies het verschil is tussen "long" en "unsigned long".
Wel is het probleem nu opgelost door gewoon long te gebruiken heel erg bedankt.
Momenteel ziet de code er zo uit.
Code: Alles selecteren
// sketch voor pan-tilt die de bewegingen van een hand volgt over de horizontale as
// gebruikt een arduino uno, 2 ultrasonic sensors en een pan tilt met een servo.
#include <Servo.h>

const int triggerR = 2; // de ultrasone sensors met hun bijbehorende poorten
const int echoR    = 3;
const int triggerL = 4;
const int echoL    = 5;

long durationL;    // variabele om de afstand en de tijd van de linker ultrasone sensor te meten
long distanceL;
long durationR;    //variabele om de afstand en de tijd van de rechter ultrasone sensor te meten
long distanceR;

Servo x;        // de motor die de pan-tilt over de horizontale as laat bewegen

int pos = 100;  // start positie uit deze positie kijkt de pan tilt recht naar voren

void setup() {
  pinMode(triggerR, OUTPUT);        //output en input van us sensoren
  pinMode(echoR,    INPUT);
  pinMode(triggerL, OUTPUT);
  pinMode(echoL,    INPUT);
  x.attach(9);                      // de servo zit op in poort 9

  Serial.begin(9600);
}
void loop() {

  //ultrasonic sensor rechts
  digitalWrite(triggerR, HIGH);
  delayMicroseconds(50);
  digitalWrite(triggerR, LOW);

  durationR = pulseIn(echoR, HIGH);
  distanceR = durationR * 0.034 / 2;

  if (distanceR >= 20)    // deze loop zorgt ervoor dat de afstand niet groter kan worden dan 20 cm
  {
    distanceR = 20;
  }
  if (distanceR <= 0)     // deze loop zorgt ervoor dat de afstand niet kleiner kan worden dan 0 cm ik had affentoe dat de sensoren negatief waarden aangavan
  {
    distanceR = 0;
  }

  // ultrasonic sensor links
  digitalWrite(triggerL, HIGH);
  delayMicroseconds(50);
  digitalWrite(triggerL, LOW);
  durationL = pulseIn(echoL, HIGH);
  distanceL = durationL * 0.034 / 2;

  if (distanceL >= 20)        // deze loop zorgt ervoor dat de afstand niet groter kan worden dan 20
  {
    distanceL = 20;
  }
  if (distanceL <= 0)         // deze loop laat de afstand niet kleiner worden dan 0
  {
    distanceL = 0;
  }


  //de servo
  /*
  if (distanceL == 0 && distanceR == 0)
  {
    pos = pos + 0;
  }
  if (distanceR == 20 && distanceL == 20)
  {
    pos = pos + 0;
  }
  if (distanceR == 0 && distanceL == 20)
  {
    pos = pos + 0;
  }
  if (distanceR == 20 && distanceL == 0)
  {
    pos = pos + 0;
  }
*/
  else {
    if (distanceL > distanceR)  // als de afstand van de linker sensor groter is dan de rechter ga naar rechts
    {
      pos = pos + 10;
    }
    if (distanceL < distanceR)  // als de afstand van de rechter sensor groter is dan de linker ga naar links
    {
      pos = pos - 10;
    }
    if (pos > 160)              // laat de positie niet groter worden dan 160
    {
      pos = 160;
    }
    if (pos < 40)                // laat de positie niet kleiner worden dan 0
    {
      pos = 40;
    }
  }


  x.write (pos);
  Serial.println ("distanceL");
  Serial.println (distanceL)  ;
  Serial.println ("distanceR") ;
  Serial.println (distanceR);
  Serial.println ("pos")  ;
  Serial.println (pos)  ;
  delay(5);
}

Gebruikers-avatar
Berichten: 2655
Geregistreerd: 06 Aug 2016, 01:03

Re: hulp gevraagd! hand volgende robot

Berichtdoor Koepel » 21 Nov 2017, 16:17

Je mag gerust op meerdere plaatsen vragen, maar dat kun je gewoon vertellen: http://forum.arduino.cc/index.php?topic=512581.0

In sketch is het nu lastig om de structuur van de if-else constructie te doorgronden. Dat zou je eerst op papier kunnen zetten in een diagram.
Deze paar regels zijn vreemd:
Code: Alles selecteren
*/
  else {

Door dat commentaar, wordt de 'else' gekoppeld aan het if-statement dat daarboven staat. Aan deze:
Code: Alles selecteren
if (distanceL <= 0)         // deze loop laat de afstand niet kleiner worden dan 0
  {
    distanceL = 0;
  }


Het ideale zou zijn als iemand met één oogopslag de structuur van de code kan zien.

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: hulp gevraagd! hand volgende robot

Berichtdoor shooter » 22 Nov 2017, 19:10

Ziet er al beter uit en begrijpbaar, die negatieve getallen zijn van rare geluiden die opgepikt worden, inderdaad als je het getal groter maakt dan ben je daar vanaf, een Unsigned wil zeggen dat een getal niet negatief kan worden, dus dan hoef je ook niet te testen op <0.
Gebruik functies:
dus zet in je loop
afstand1=sensor1();
afstand2=sensor2();
beweegservos(s1,s2,s3)
enz.
en daaronder dan de functies zelf. dat maakt het allemaal leesbaarder en de volgende stap is dan om de sensoren maar in een array te zetten en dan de functie 3 keer aanroepen zoals afstand[1]=sensor(1)
dan hoef je alles maar 1 keer te schrijven, zelfde kan natuurlijk ook voor de servos servo(1,posx) en servo(2,posy)
met drie sensoren gaat wel hoor, maar is wiskundig (simpelste is kijk naar de kleinste en beweeg daar naar toe (dat betekent dus dat zowel servo1 als servo2 bewegen.
Als dat een beetje werkt, ga dan een gemiddelde zoeken van je sensoren (zeker als het rumoerig is heb je veel valse readings).
zorg dat die pulseIn in tijd beperkt wordt (in tijd) dan gaat het sneller, maar ja geluid gaat niet snel, dus je zult toch wel even (100 ms bijvoorbeeld) moeten wachten.
paul deelen
shooter@home.nl

Terug naar Gezamenlijke projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 9 gasten