Voorstellen en vraag m.b.t. Servos en keypad

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 44
Geregistreerd: 07 Dec 2019, 15:13

Voorstellen en vraag m.b.t. Servos en keypad

Berichtdoor jabjab » 07 Dec 2019, 15:32

Hallo Allemaal,

Mijn naam is Jan en ik ben helemaal nieuw in het Arduino gebeuren. Mijn "primaire" hobby is houtbewerking en ik heb al gezien dat deze hobby's goed te combineren zijn. Ik heb wel een beetje basis electronica kennis maar totaal geen programeer kennis.

Het project waar ik nu mee bezig ben is het geautomatiseerd open en dichtzetten van kleppen in de stofafzuiging. Het komt er op neer dat ik 6 servos wil aansturen met een keypad. als ik op 1 druk dan moet servo 1 in een bepaalde positie komen te staan en alle andere servo's terug naar hun basis positie. druk ik op 2 dan moet servo 2 in een bepaalde positie komen te staan en servo 1 weer terug naar zijn basis positie (de rest van de servos staan al in die positie).

Eigenlijk exact wat hier gedaan wordt: https://iliketomakestuff.com/automated-blast-gates/ Bij deze website is zelfs een code te downloaden en dat heb ik uiteraard ook gedaan. Maar ik krijg het niet werkend.. ik heb ook het gevoel dat de code onnodig uitgebreid is maar ik heb er te weinig kennis van om dat zeker te weten.

ik heb MG995 servos en gebruik een aparte voeding voor het voeden van de servos (de min heb ik ook op de grd van de Arduino Uno aangesloten).

ik kan op internet veel vinden over het aansturen van 1 servo via een keypad maar bijna niets over meerdere servos. Kunnen jullie me hiermee verder helpen? heeft iemand een code voor het aansturen van meerdere servos met behulp van een keypad?


Wie kan mij verder op weg helpen?

Groeten,
Jan

Advertisement

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

Re: Voorstellen en vraag m.b.t. Servos en keypad

Berichtdoor Koepel » 07 Dec 2019, 19:50

Die code is inderdaad onnodig uitgebreid.

Heb je de Keypad library geïnstalleerd ? Heb je daarvoor de "Bibliotheek Beheer" gebruikt ?
Kijk in het menu of je de voorbeelden kunt vinden.
Zie je daar "HelloKeypad.ino" staan ?
Dat is deze: https://github.com/Chris--A/Keypad/blob/master/examples/HelloKeypad/HelloKeypad.ino.
Probeer dat eens en druk op alle knoppen.
Werkt dat ?

De Servo library wordt met de Arduino IDE meegeleverd.
Het bestaat uit een paar dingen zoals je hier ziet: https://www.arduino.cc/en/Tutorial/Knob.
Als je dat allemaal 6 keer doet dan krijg je dit:
Code: Alles selecteren
#include <Servo.h>

// Declareer de verschillende objecten voor de servo motoren
Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;
Servo servo5;
Servo servo6;

void setup()
{
  // Ken een pin nummer toe aan de servo motoren
  // De analoge ingangen zijn ook digitale uitgangen.
  // Ze worden hier als digitale uitgangen gebruikt voor de servo motoren.
  servo1.attach( A0);
  servo2.attach( A1);
  servo3.attach( A2);
  servo4.attach( A3);
  servo5.attach( A4);
  servo6.attach( A5);
}

void loop()
{
  // Laat de servo motoren bewegen

  servo1.write( 0);
  servo2.write( 180);
  servo3.write( 180);
  servo4.write( 180);
  servo5.write( 180);
  servo6.write( 180);
  delay( 1000);

  servo1.write( 180);
  servo2.write( 0);
  servo3.write( 0);
  servo4.write( 0);
  servo5.write( 0);
  servo6.write( 0);
  delay( 1000);
}


Wat de functies doen en hoe je ze gebruikt staat allemaal online. Bijvoorbeeld: https://www.arduino.cc/en/Reference/ServoAttach.

Met een keypad van 4x3 en 6 servo motoren heb je totaal 13 pinnen nodig.
Bij een Arduino Uno zijn de analoge ingangen ook digitale pinnen. Pin 0 en 1 zijn voor de seriële monitor en het uploaden van een sketch. Dus je hebt nog 18 pinnen over die zowel voor de keypad als de servo motoren te gebruiken zijn.

De MG995 heeft een stall current van 1.5A of 1.2A (verschillende websites geven verschillende gegevens), dus je voeding voor de servo motoren moet in het uiterste geval een stroom van 9A kunnen leveren.

Berichten: 44
Geregistreerd: 07 Dec 2019, 15:13

Re: Voorstellen en vraag m.b.t. Servos en keypad

Berichtdoor jabjab » 08 Dec 2019, 12:02

Hallo Koepel,

Bedankt voor de uitgebreide reactie!

Ik had de bibliotheek Keypad.H gedownload, Ik ga eens testen met de HelloKeypad.ino

ik heb op dit moment een 5 Ampere voeding maar volgens mij hoeven er eigenlijk maar steeds 2 servos tegelijk te bewegen en zou dat voldoende moeten zijn?
Laatst gewijzigd door jabjab op 08 Dec 2019, 12:46, in totaal 1 keer gewijzigd.

Berichten: 44
Geregistreerd: 07 Dec 2019, 15:13

Re: Voorstellen en vraag m.b.t. Servos en keypad

Berichtdoor jabjab » 08 Dec 2019, 12:39

Stap 1 is gelukt. Ik kon de hellokeypad.ino niet vinden maar heb de code gekopieerd. in eerste instantie kreeg ik niet de juiste reactie maar door onderstaande regels aan te passen (lang leve Youtube)

byte rowPins[ROWS] = {2, 3, 4, 5}; //connect to the row pinouts of the keypad

byte colPins[COLS] = {6, 7, 8}; //connect to the column pinouts of the keypad

nu werkt dit dus goed. (mijn eerste resultaat :) )

Berichten: 44
Geregistreerd: 07 Dec 2019, 15:13

Re: Voorstellen en vraag m.b.t. Servos en keypad

Berichtdoor jabjab » 08 Dec 2019, 12:50

Hallo Koepel,

Als ik het goed begrijp dan kan ik dit deel van de code:

Code: Alles selecteren

void loop()
{
  // Laat de servo motoren bewegen

  servo1.write( 0);
  servo2.write( 180);
  servo3.write( 180);
  servo4.write( 180);
  servo5.write( 180);
  servo6.write( 180);
  delay( 1000);

  servo1.write( 180);
  servo2.write( 0);
  servo3.write( 0);
  servo4.write( 0);
  servo5.write( 0);
  servo6.write( 0);
  delay( 1000);
}


voor elke knop van de keypad toevoegen. dus als ik op knop 1 druk dan gaat dit deel van de code "lopen". druk ik op knop 2 dan gaat het tweede (nog toe te voegen deel lopen).

Hoe koppel ik zo'n stukje code aan een input van het keypad?

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

Re: Voorstellen en vraag m.b.t. Servos en keypad

Berichtdoor Koepel » 08 Dec 2019, 14:40

Met heel veel if-statements of met een switch-case.
Als je bekend bent met if-statements en niet met een switch-case, dan zijn if-statements eenvoudiger.

Alles draait om keypad.getKey(). Die geeft de code van de ingedrukte toets terug. Dat zijn de codes die je zelf hebt opgegeven bij de keys[ROWS][COLS]. Dus '0', '1', '#' enzovoorts.
Als er niets wordt ingedrukt, dan geeft die NO_KEY terug. Dat is 0 of '\0', een nul dus, het getal nul, niet het ASCII leesbare teken voor nul.

Code: Alles selecteren
char key = keypad.getKey();

if( key != NO_KEY)  // is er iets ingedrukt ?
{
  if( key == '1')
  {
    Serial.println( "Er is een 1 ingedrukt");
    servo1.write( 0);
    servo2.write( 180);
    servo3.write( 180);
    servo4.write( 180);
    servo5.write( 180);
    servo6.write( 180);
  }
 
  if( key == '2')
  {
    Serial.println( "Er is een 2 ingedrukt");
    ...
  }

  ...
}


Van mij mag je zelfs het if-statement met NO_KEY weglaten:

Code: Alles selecteren
char key = keypad.getKey();

if( key == '1')
{
  Serial.println( "Er is een 1 ingedrukt");
  servo1.write( 0);
  servo2.write( 180);
  servo3.write( 180);
  servo4.write( 180);
  servo5.write( 180);
  servo6.write( 180);
}
 
if( key == '2')
{
  Serial.println( "Er is een 2 ingedrukt");
  ...
}

...


Ik weet niet wat er gebeurt als je een toets lang ingedrukt houdt. Ik hoop dat het dan maar één keer wordt uitgevoerd, maar zo goed heb ik de library niet bekeken.

De sketch wordt groot met al die if-statements, het kan natuurlijk ook op een slimme manier. Maar ik denk dat je het nu voor elkaar kunt krijgen. Vraag gerust als het niet lukt.

Een voeding van 5A is voldoende, als die een kortsluitbeveiliging heeft. Stel dat je waterschade krijgt en alles loopt vast, dan zouden de servo motoren eventueel allemaal hun maximale stroom kunnen vragen.
In een normale situatie is het mogelijk dat de servo motoren een piekstroom vragen op het moment dat ze beginnen met draaien. Dat kun je uitsmeren over een langere tijd door overal een delay() tussen te zetten. Dan wordt de sketch nog groter.

Code: Alles selecteren
    servo1.write( 0);
    delay(50);       // niet allemaal tegelijkertijd
    servo2.write( 180);
    delay(50);
    servo3.write( 180);
    delay(50);
    servo4.write( 180);
    delay(50);
    servo5.write( 180);
    delay(50);
    servo6.write( 180);
    delay(50);

Berichten: 44
Geregistreerd: 07 Dec 2019, 15:13

Re: Voorstellen en vraag m.b.t. Servos en keypad

Berichtdoor jabjab » 08 Dec 2019, 16:22

Het is gelukt!!! het werkt! ik ben hier echt heel blij mee. Dank je wel Koepel!


Ik zou nog graag een laatste toevoeging doen en dat is een display waarop de tekst staat afhankelijk van de ingedrukte toets. dus bijvoorbeeld als toets 1 ingedrukt wordt dat er op het display staat: "Toets 1 is ingedrukt" (en kan er dan eenvoudig nog een tekst op de tweede regel van het LCD scherm? bijvoorbeeld "Systeem stofafzuiging")

ik heb een - 1602 LCD I2c blauw backlight- display die ik met vier draden zou moeten kunnen aansluiten. waar moet ik dit dan op aansluiten en wat moet er waar worden toegevoegd aan de code. De code ziet er nu zo uit:




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

// Declareer de verschillende objecten voor de servo motoren
Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;
Servo servo5;
Servo servo6;


const byte ROWS = 4; //four rows

const byte COLS = 3; //three columns

char keys[ROWS][COLS] = {

  {'1','2','3'},

  {'4','5','6'},

  {'7','8','9'},

  {'*','0','#'}

};

byte rowPins[ROWS] = {2, 3, 4, 5}; //connect to the row pinouts of the keypad

byte colPins[COLS] = {6, 7, 8}; //connect to the column pinouts of the keypad



Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );



void setup(){

  Serial.begin(9600);

  // Ken een pin nummer toe aan de servo motoren
  // De analoge ingangen zijn ook digitale uitgangen.
  // Ze worden hier als digitale uitgangen gebruikt voor de servo motoren.
  servo1.attach( A0);
  servo2.attach( A1);
  servo3.attach( A2);
  servo4.attach( A3);
  servo5.attach( A4);
  servo6.attach( A5);
}

void loop(){

  char key = keypad.getKey();

 

if( key == '1')
{
  Serial.println( "Er is een 1 ingedrukt");
  servo1.write( 0);
  servo2.write( 90);
  servo3.write( 90);
  servo4.write( 90);
  servo5.write( 90);
  servo6.write( 90);
}

if( key == '2')
{
  Serial.println( "Er is een 2 ingedrukt");
  servo1.write( 90);
  servo2.write( 0);
  servo3.write( 90);
  servo4.write( 90);
  servo5.write( 90);
  servo6.write( 90);

 }

if( key == '3')
{
  Serial.println( "Er is een 3 ingedrukt");
  servo1.write( 90);
  servo2.write( 90);
  servo3.write( 0);
  servo4.write( 90);
  servo5.write( 90);
  servo6.write( 90);

 }

if( key == '4')
{
  Serial.println( "Er is een 4 ingedrukt");
  servo1.write( 90);
  servo2.write( 90);
  servo3.write( 90);
  servo4.write( 0);
  servo5.write( 90);
  servo6.write( 90);
}

if( key == '5')
{
  Serial.println( "Er is een 5 ingedrukt");
  servo1.write( 90);
  servo2.write( 90);
  servo3.write( 90);
  servo4.write( 90);
  servo5.write( 0);
  servo6.write( 90);

 }

if( key == '6')
{
  Serial.println( "Er is een 6 ingedrukt");
  servo1.write( 90);
  servo2.write( 90);
  servo3.write( 90);
  servo4.write( 90);
  servo5.write( 90);
  servo6.write( 0);

}

  }


Berichten: 44
Geregistreerd: 07 Dec 2019, 15:13

Re: Voorstellen en vraag m.b.t. Servos en keypad

Berichtdoor jabjab » 08 Dec 2019, 17:27

of heb ik niet genoeg poorten voor 6 servos en een display?

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

Re: Voorstellen en vraag m.b.t. Servos en keypad

Berichtdoor Koepel » 08 Dec 2019, 17:47

Mooi gedaan :D

Een I2C display ? Dan heb je A4 en A5 nodig. Dus wat daar nu op zit zul je moeten verplaatsen naar andere pinnen.
Je kunt beter eerst het I2C display uitproberen met een eigen test-sketch. Daar kun je deze les voor volgen: https://www.youtube.com/watch?v=o9TrnCcZAGY.
Hij gebruikt de library van Frank de Brabander. Er zijn nogal veel libraries voor een I2C display.
Via de link naar zijn website kun je ook de link naar Github vinden met de sketches: https://github.com/BasOnTech/Arduino-Beginners-NL/tree/master/E11-I2C-LCD.
Als dat werkt, dan kun je proberen om het toe te voegen.

Berichten: 44
Geregistreerd: 07 Dec 2019, 15:13

Re: Voorstellen en vraag m.b.t. Servos en keypad

Berichtdoor jabjab » 08 Dec 2019, 18:22

Koepel schreef:Mooi gedaan :D

Een I2C display ? Dan heb je A4 en A5 nodig. Dus wat daar nu op zit zul je moeten verplaatsen naar andere pinnen.
Je kunt beter eerst het I2C display uitproberen met een eigen test-sketch. Daar kun je deze les voor volgen: https://www.youtube.com/watch?v=o9TrnCcZAGY.
Hij gebruikt de library van Frank de Brabander. Er zijn nogal veel libraries voor een I2C display.
Via de link naar zijn website kun je ook de link naar Github vinden met de sketches: https://github.com/BasOnTech/Arduino-Beginners-NL/tree/master/E11-I2C-LCD.
Als dat werkt, dan kun je proberen om het toe te voegen.



naar welke pinnen kan ik de servos verplaatsen?

Volgende

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 11 gasten