Klinkt goed.

Er zal een calibratie/startpunt gelden voor die motor? Ik denk dat je daar met je ontwerp wel rekening mee moet houden.

Thanx!

De eerste 3 codes doen het. Al begrijp ik niet hoe de verkorte code 'weet' dat hij na 5x knipperen, 10 seconde moet wachten. Dit kan ik niet terug vinden in de code?

void loop(){
knipperled();
knipperled();
knipperled();
knipperled();
knipperled();
}

void knipperled(){
digitalwrite(led,HIGH);
delay(500);
digitalwrite(led,LOW);
delay(500);
}

En hoe zet ik de loop op stop?

De andere codes krijg ik een foutmelding op het ">".
Ik krijg deze er niet uit.

for (int i=0, i<5, i++){

Maar langzaam wordt steeds meer duidelijk, super bedankt!

Op woensdag 7 februari 2024 11:01:51 schreef K7Jz:
Klinkt goed.

Er zal een calibratie/startpunt gelden voor die motor? Ik denk dat je daar met je ontwerp wel rekening mee moet houden.

is dat standaard bij de sevo's?
Dan zal ik wat anders moeten verzinnen... want hij kan niet gaan afwijken van de ingestelde marge van grades. Er is te weinig bewegingsruimte

de loop stoppen, moet je integreren met ee drukknop ofzo, maar dat is voor later.

ik wilde hier gewoon aantonen hoe je verschillende codes kan maken met hetzelfde resultaat.
eerst volledig uitgeschreven, dan kleiner en kleiner.

het deel code dat je quote had geen 10sec wachten op het einde. dat moest op het einde van het 'loop' gedeelte komen, maar die 10sec is niet van belang hier.

loop stoppen lukt niet, tenzij je die opzettelijk laat hangen.

bv if (1) { }
zolang 1 dus juist is, blijft die tussen de haakjes hangen. dat eindigd dus nooit meer en je moet de arduino dan resetten

de code dat ik aanhaalde was ook los geschreven. er zit dus een fout in die for loop
for (int i=0, i<5, i++){
moet zijn
for (int i=0; i<5; i++){

Voor de ogen heb ik um!

En ben best trots, dus ondanks dat dit voor jullie een makkie is, deel ik vol trost mijn voortgang :)

En dat is 2...

Nu enkel nog de servo.

Zie bijlage.

Mooi!

Nu wel op ritme van spraak gaan knipperen he.

Op woensdag 7 februari 2024 17:03:57 schreef K7Jz:
Mooi!

Nu wel op ritme van spraak gaan knipperen he.

nou dat Ritme laat ik aan de lippen over, ofwel de servo ;)
dat wordt nog even studeren.

De eerste 3 codes doen het. Al begrijp ik niet hoe de verkorte code 'weet' dat hij na 5x knipperen, 10 seconde moet wachten. Dit kan ik niet terug vinden in de code?

Dat staat ook niet in de code die je daar laat zien. In die code zijn 5 regels die elke de led 1 keer aan en uit zet.

Als je na 5c 10 seconden wilt wachten moet je dat nog toevoegen.


    void loop(){
    knipperled();
    knipperled();
    knipperled();
    knipperled();
    knipperled();
    delay(10000);
    }

    void knipperled(){
    digitalwrite(led,HIGH);
    delay(500);
    digitalwrite(led,LOW);
    delay(500);
    }

Nu is het hoofdprogramma onder loop dus 5x knipperen en daarna 10 seconde wachten.
Merk ook op dat ik het programma in code tags heb gezet. Dat is het icoontje recht nast de quote knop en daar kies je dan voor de programmeertaal "C".

En hoe zet ik de loop op stop?

Aruino kent 2 hoofdfuncties loop en setup.
Setup word precies 1x uitgevoerd en daarna loop oneindig lang zo lang de arduino aan staat.

knipperled is hier een eigen gemaakt functie die bij aanroep 1x word uitgevoerd. Hier is het wel mogelijk om eerder uit deze functie te gaan met keyword zoals break of return. Maar daar zo ik me nu nog niet mee bezig houden.

is dat standaard bij de sevo's?

Weet ik niet ik heb er nog nooit mee gewerkt. Maar als een servo niet aangestuurd word gaat hij dacht ik vanzelf naar 0 positie.
De servo kan dacht ik zo 300 graden draaien? Geen idee welke type jij hebt. Er zitten ook hulpstukken bij dus je kan alles zo verstellen dat de servo wel zijn hele slag kan maken en ook kan je denk ik wel op de servo een einde slag oid zetten of zelf maken.

Nieuwe dag nieuwe uitdaging.

Ik wilde vanmorgen verder gaan waar ik gister ben gebleven, kwam er geen geluid meer uit.

Wat blijkt, de knoopcel batterijen (oplaadbaar) welke in het printplaatje voor het geluid zat, is gedurende de nacht volledig leeg gelopen.

nu kan ik hem via een Micro USB opladen, maar ik wil eigenlijk dat hij straks via de voeding van de Arduino wordt opgeladen en dat ik niet voor elk onderdeel straks aparte batterijen eraan moet hangen (helemaal niet als deze met een nacht leeg lopen)

Hij werk niet als ik hem middels de mico USB aan het stroom hang en de batterijen verwijder. Deze moeten er dus wel in zitten.

Batterijen zijn rood aangewezen, Micro USB ingang met blauw.

Is er een plek op de printkaart waar ik de 5v vanuit de Arduino op kan vastmaken zodat de batterijen vanuit de arduino wordt opgeladen?

https://i.ibb.co/jJdLBhh/Schermafbeelding-2024-02-08-094104.jpg

heb je een link waar je dat spul kocht, want zo op die foto kan ik weinig zien

als die 3V batterijen zijn, zou je die batterij misschien kunnen weghalen en de draadjes op de 3,3V hangen van de arduino.

Op donderdag 8 februari 2024 10:39:52 schreef fcapri:
heb je een link waar je dat spul kocht, want zo op die foto kan ik weinig zien

als die 3V batterijen zijn, zou je die batterij misschien kunnen weghalen en de draadjes op de 3,3V hangen van de arduino.

Alles van Ali:

https://nl.aliexpress.com/item/1005005880794722.html?spm=a2g0o.order_l…

het zijn 2, 3,6v batterijtjes

haal ze eruit, en hang de batterij contacten eens aan de arduino 3,3V. mogelijks werkt dat direct
opletten bij + en - bij die knoopcellen, veel kans is die grote metalen plaat rond de accu de + pool

of een usb kabel afknippen en die direct aan de arduino 5V. dan wordt ze continue bijgeladen

[Bericht gewijzigd door fcapri op (19%)]

Hoi,

Door ziekte helaas wat minder ermee bezig geweest afgelopen dagen. Maar heb vandaag, nog net voor de voorjaarsvakantie begint, nog even wat uurtjes om te knutselen.

De buitenkant is af, zal even voor het idee een fototje plaatsen.

Willen jullie mij helpen om onderstaande 2 scripts bij elkaar te voegen?
Script 1 is ogen en stem, dat werkt.
Script 2 is heel simpel de servo heen en weer laten gaan.
Als ik deze combineer gaat het echter totaal fout en werkt niets meer.

Hoe krijg ik script 2 in script 1, en stopt hij ook tegelijkertijd met het knipperen van de ogen?

script 1:

const int buttonPin = 2; // the number of the pushbutton pin
const int ledPin = 13; // the number of the LED pin
const int soundpin=A2;
const int threshold=200;
const int uitgeluid = 12;

// variables will change:
int buttonState = 0; // variable for reading the pushbutton status

void setup() {
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
pinMode(uitgeluid, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT);
Serial.begin(9600);
pinMode(soundpin,INPUT);

}

void loop() {
// read the state of the pushbutton value:
buttonState = digitalRead(buttonPin);

// check if the pushbutton is pressed. If it is, the buttonState is HIGH:
if (buttonState == HIGH) {
// turn LED on:
digitalWrite(ledPin, HIGH);
delay(5000);
} else {
// turn LED off:
digitalWrite(ledPin, LOW);
}
int soundsens=analogRead(soundpin);
if (soundsens>=threshold) {
//turns ledPin on
digitalWrite(uitgeluid,HIGH);
digitalWrite(ledPin,HIGH);
delay(1800);

}
else{
digitalWrite(ledPin,LOW);
}
}

script 2

#include <Servo.h>

Servo myservo; // create servo object to control a servo
// twelve servo objects can be created on most boards

int pos = 0; // variable to store the servo position

void setup() {
myservo.attach(9); // attaches the servo on pin 9 to the servo object
}

void loop() {
for (pos = 60; pos <= 80; pos += 1) { // goes from 0 degrees to 180 degrees
// in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15 ms for the servo to reach the position
}
for (pos = 80; pos >= 60; pos -= 1) { // goes from 180 degrees to 0 degrees
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15 ms for the servo to reach the position
}
}

Alvast bedankt!

Gr.
Ivo

https://i.ibb.co/c2ZdGST/Whats-App-Image-2024-02-16-at-13-11-03.jpg

Je hebt je sketch in quote tags gezet. Beter is om het icoontje met de rode <> te gebruiken en daar C als programmertaal te kiezen dat maakt de tekst beter leesbaar.

IK heb de 2 sketch samengevoegd en volgend de compiler zijn er geen fouten.
Maar of het werkt zoal bedoelt moet je zelf testen. In arduino noemen zet het geen script maar een sketch maar wat mij betreft heeft beide dezelfde betekenis.

Voor het samen voegen:

  • Include's bovenaan zetten.
  • Initialiseren van objecten zoals Servo myservo daar onder
  • Alle initializaties van variablen daar weer onder en bij elkaar zetten.
  • Dan de 2 setup bij elkaar voegen volgorde maakt niet echt uit ik probeer het voor mezelf wel overzichtelijk te houden.
  • En dan de loop() ook bij elkaar zetten. Maar wel de code als blokken bij elkaar houden.

Ik heb van de loop() van de servo een aparte functie blok moveServo gemaakt die ik vanuit het hoofdprogramma 1x aanroep. Dat maakt het overzichtelijker.

Ik verwacht nu niet gelijk dat je het ook kan maar at je wel kan zien hoe ik het gedaan hebt en dat je ziet wat waar naar toe verplaatst is.

Waarom ik denk dat het niet werkt zoals je zou willen dat komt door de vele delay's. Delay(5000) betekend voor de cpu letterlijk doe compleet niets de voor 5 seconden. En er gebeurt dus ook niet geen servo aansturen, geen buttons uitlezen enz. Dit noemt men blocking code.
Er is gelukkig wel een manier om van de delays af te komen en het anders op te lossen zodat er geen blocking code meer is. Maar het vergt wel wat meer denkwerk en creativiteit.
Maar test toch maar dit programma en vandaar zien we wel verder misschien valt het mee.

    #include <Servo.h>
     Servo myservo; // create servo object to control a servo
    // twelve servo objects can be created on most boards

    
    const int buttonPin = 2; // the number of the pushbutton pin
    const int ledPin = 13; // the number of the LED pin
    const int soundpin = A2;
    const int threshold = 200;
    const int uitgeluid = 12;

    // variables will change:
    int buttonState = 0; // variable for reading the pushbutton status
    int pos = 0; // variable to store the servo position
    
    void moveServo() {
    for (pos = 60; pos <= 80; pos += 1) { // goes from 0 degrees to 180 degrees
      // in steps of 1 degree
      myservo.write(pos); // tell servo to go to position in variable 'pos'
      delay(15); // waits 15 ms for the servo to reach the position
      }
    for (pos = 80; pos >= 60; pos -= 1) { // goes from 180 degrees to 0 degrees
      myservo.write(pos); // tell servo to go to position in variable 'pos'
      delay(15); // waits 15 ms for the servo to reach the position
      }
    }
    
    void setup() {
    // initialize the LED pin as an output:
    pinMode(ledPin, OUTPUT);
    pinMode(uitgeluid, OUTPUT);
    // initialize the pushbutton pin as an input:
    pinMode(buttonPin, INPUT);
    myservo.attach(9); // attaches the servo on pin 9 to the servo object
    
    Serial.begin(9600);
    pinMode(soundpin,INPUT);

    }

    void loop() {
    // read the state of the pushbutton value:
    moveServo();
    buttonState = digitalRead(buttonPin);

    // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
    if (buttonState == HIGH) {
      // turn LED on:
      digitalWrite(ledPin, HIGH);
      delay(5000);
      } else {
      // turn LED off:
      digitalWrite(ledPin, LOW);
      }
    int soundsens = analogRead(soundpin);
    if (soundsens >= threshold) {
      //turns ledPin on
      digitalWrite(uitgeluid,HIGH);
      digitalWrite(ledPin,HIGH);
      delay(1800);
  
      }
      else{
      digitalWrite(ledPin,LOW);
      }
    }

Hey,

Dit is inderdaad een beetje waar ik tegenaan liep.
De servo gaat nu onafgebroken heen en weer, en de rest werkt niet meer.

Ik had juist verwacht dat de servo af en toe zou stoppen als je een drukknop gebruikt.

Als je nu even // voor moveServo zet werkt het de drukknoppen en de rest dan wel?

Onderstaande code is minder blocking.
Let erop dat je de bovenste variabele ook wijzigt en toevoegt
En de code in de oude moveServo overschrijf je nu met onderstaande moveServo

    int pos = 60; // variable to store the servo position
    bool movePos = true;
    

    void moveServo(){
      myservo.write(pos);
      if (movePos) { // check to see to move positieve or not If movePos is true move postieve or else move oposite
        pos++;     //is hetzelfde als pos = pos + 1
        if (pos == 80){ // check for max movement en reverse direcetion bij setting movePos to false
          movePos = false;
        }
      } else {
        pos--;      // pos = pos -1
        if (pos == 60) {
          movePos = true;
        }
      }
      delay(15);
    }

Deze code blokkert niet omdat het ipv een complete beweging + delay's nu steeds maar 1 stapje van de beweging uitvoert.
Met movePos hou ik bij welke richting de beweging moet gaan. En pos is gewoon de positie waar de servo naar toe moet bewegen.

Omdat er nu steeds maar 1 stapje word uitgevoerd zouden de drukknoppen weer moeten werken.

Op vrijdag 16 februari 2024 17:26:37 schreef benleentje:
Ik had juist verwacht dat de servo af en toe zou stoppen als je een drukknop gebruikt.

Als je nu even // voor moveServo zet werkt het de drukknoppen en de rest dan wel?

ja, maar de servo niet meer

Op vrijdag 16 februari 2024 17:45:40 schreef IvovdA:
[...]

ja, maar de servo niet meer

Ja dat weet ik ;). Maar om te kunnen fout zoeken moet je even tijdelijk iets uitzetten om te zien of de rest dan wel werkt. Als de rest dan wel werkt weet je dat je daar niet verder naar moet kijken. Maar werken de drukknoppen dan nog niet dan zit daar de fout.

Ik heb ondertussen al een andere moveServo subroutine voor je gemaakt die denk ik het probleem al oplost.

Op vrijdag 16 februari 2024 17:42:08 schreef benleentje:
Onderstaande code is minder blocking.
Let erop dat je de bovenste variabele ook wijzigt en toevoegt
En de code in de oude moveServo overschrijf je nu met onderstaande moveServo

    int pos = 60; // variable to store the servo position
    bool movePos = true;
    

    void moveServo(){
      myservo.write(pos);
      if (movePos) { // check to see to move positieve or not If movePos is true move postieve or else move oposite
        pos++;     //is hetzelfde als pos = pos + 1
        if (pos == 80){ // check for max movement en reverse direcetion bij setting movePos to false
          movePos = false;
        }
      } else {
        pos--;      // pos = pos -1
        if (pos == 60) {
          movePos = true;
        }
      }
      delay(15);
    }

Deze code blokkert niet omdat het ipv een complete beweging + delay's nu steeds maar 1 stapje van de beweging uitvoert.
Met movePos hou ik bij welke richting de beweging moet gaan. En pos is gewoon de positie waar de servo naar toe moet bewegen.

Omdat er nu steeds maar 1 stapje word uitgevoerd zouden de drukknoppen weer moeten werken.

Hier moet ik eens rustig naar kijken, want als ik de een met de ander verwissel krijg ik foutmeldingen.

Als je een foutmelding krijgt heb je denk ik toch iets niet goed gekopieerd
. Het help dan om even de exacte foutmelding te laten zien. Fouten maken en opsporen hoort helaas bij het programmeren ik maar ik vergeet ook nog steeds af een tot een ; te zetten aan het einde van een regel.

Hier de complete code die bij mij geen foutmeldingen geeft.

    #include <Servo.h>
     Servo myservo; // create servo object to control a servo
    // twelve servo objects can be created on most boards

    
    const int buttonPin = 2; // the number of the pushbutton pin
    const int ledPin = 13; // the number of the LED pin
    const int soundpin = A2;
    const int threshold = 200;
    const int uitgeluid = 12;

    // variables will change:
    int buttonState = 0; // variable for reading the pushbutton status
    int pos = 60; // variable to store the servo position
    bool movePos = true;
    
    void moveServo(){
      myservo.write(pos);
      if (movePos) { // check to see to move positieve or not
        pos++;
        if (pos == 80){ // check for max movement en reverse direcetion bij setting movePos to false
          movePos = false;
        }
      } else {
        pos--;
        if (pos == 60) {
          movePos = true;
        }
      }
      delay(15);
    }

    void setup() {
    // initialize the LED pin as an output:
    pinMode(ledPin, OUTPUT);
    pinMode(uitgeluid, OUTPUT);
    // initialize the pushbutton pin as an input:
    pinMode(buttonPin, INPUT);
    myservo.attach(9); // attaches the servo on pin 9 to the servo object
    
    Serial.begin(9600);
    pinMode(soundpin,INPUT);

    }

    void loop() {
    // read the state of the pushbutton value:
    moveServo();
    buttonState = digitalRead(buttonPin);

    // check if the pushbutton is pressed. If it is, the buttonState is HIGH:
    if (buttonState == HIGH) {
      // turn LED on:
      digitalWrite(ledPin, HIGH);
      delay(5000);
      } else {
      // turn LED off:
      digitalWrite(ledPin, LOW);
      }
    int soundsens = analogRead(soundpin);
    if (soundsens >= threshold) {
      //turns ledPin on
      digitalWrite(uitgeluid,HIGH);
      digitalWrite(ledPin,HIGH);
      delay(1800);
  
      }
      else{
      digitalWrite(ledPin,LOW);
      }
    }

het script blokt nu niet meer inderdaad, maar werkt niet als gewenst.

De servo gaat nu non-stop heen en weer, enkel als ik de drukknop gebruik gaan de lampjes voor enkele seconde knipperen. De servo stopt op dat moment en gaat weer verder als de lampjes weer zijn gedoofd.

de 'clapper' werkt nu helemaal niet meer.

nog een vraag... ik probeer mn geluidskit van stroom te voorzien via de power van de Arduino.

Op zich gaat dit, maar ik merk dat dit invloed heeft op de andere dingen, en dat snap ik niet.

1 5v uitgang gaat naar mn knop. de andere 5v gaat naar de clapper sensor.

Als ik mn snoertjes op 1 van de 2 bij prik krijgt mn geluidskit wel stroom, maar werkt dus iets anders niet naar behoren. lampjes blijven bv knipperen en gaan niet meer uit, of hij gaat überhaupt niet meer aan...

en dat begrijp ik niet...

één van de problemen dat je nu hebt is multitasking.

de cpu doet 1 ding bij u. dat is ofwel servo besturen, ofwel reageren op een knopje.
maar niet samen.

als alles werd opgesplitst in losse dingen, kan je nu gaan dingen mengen. ofwel werk je met threads (de cpu doet telkens 1 stukje van de verschillende codes),
ofwel moet je de code zo gaan bouwen dat ze samen werken.

bv
terwijl het geluidje speelt:
knipper 1x met de ogen,
beweeg servo heen en weer voor 3keer,
knipper 1x met de ogen
serve 3keer
... tot het geluidje gedaan is

wat jij nu bijvoorbeeld hebt:
led aan
wacht 5sec
led uit

dan heb je 5sec lang geen actie van de servo of leds.

je zal van veel delay's af moeten gaan en dat kan met het volgende:
de huidige tijd van je arduino is millis().
dus ik zeg:
begintijdLed = millis();
knipper led
en dan wacht ik met nog eens knipperen tot er 3sec verlopen zijn.
if ( millis() > begintijdLed+3000 ){
knipper led
}

en zo zal je dat voor alle stukjes code moeten doen. als je zo de servo 500millisec laat bewegen en de leds elke 3000ms. dan lijkt het of ze samen werken.

je zal de loop nu moeten aanpassen dat die daar 1000 keer per seconde doorloop zonder delays.
daarin staat dan dat die moet kijken of de knop is ingedrukt
eventueel een led aanzetten
geluid spelen
servo besturen

de volgende 3000keer dat je er doorloopt, moet de led niks doen

ik vermoed dat veel toch niet samen moet.
de servo's gaan moeten werken als er geluid afspeelt, en per 3keer ofzo dat de mond beweegt, laat je de leds eens knipperen.
dat lijkt mij het eenvoudigste

da heb je een loop
daarin kijk je naar de knop en is die ingedrukt, speel je geluid af.
daarbij nog eens servo en leds knipperen