Salve a tutti,setup Servo motor Parallax 360° + Arduino uno r4 wifi + due bottoni da dashboard, non riesco a far ruotare il servo orario e antiorario

Salve, come ho scritto sul titolo, il mio semplice progetto con arduino uno R4 Wifi, sarebbe quello di far ruotare un servo motore parallax 360° , avanti e indietro,
questo il mio setup


questo il codice :

Qualcuno riesce ad aiutarmi?
il motore gira ininterrotamente a 360° solo da un lato.

Grazie
Massimiliano

NO se i programmi li metti come immagine ...

I programmi si devono copiare ed incollare e poi racchiudere nei tag CODE ... in pratica seleziona la parte di codice e poi premi l'icona <code/> nella barra degli strumenti per contrassegnarla come codice.

Guglielmo

questo è il primo sketch, dimentica quello che scritto prima, ne devo fare uno di sketch, questo sketch funziona, con un pulsante, il servo gira da 0 a 180 e viceversa, però volevo fare il merge dei due sketches che ho postato, in pratica far apparire la scritta Closed quando il servo ruota a 0 a 180 :

# include <Servo.h>
Servo myServo;

const int SwitchPin = 8;
byte butLst;
int  butCnt;


void setup ()
{
    Serial.begin (9600);
    pinMode (SwitchPin, INPUT_PULLUP);
    butLst = digitalRead (SwitchPin);
    myServo.attach (9);
}

void loop ()
{
    byte but = digitalRead (SwitchPin);
    if (butLst != but)  {   // change
        butLst = but;
        delay (20);         // debounce

        if (LOW == but)  {  // press
            butCnt++;
            Serial.println (butCnt);
            if (butCnt % 2)
                myServo.write (180);     // odd
            else
                myServo.write (0);      // even
        }
    }
}


questo è il secondo sketch :

#include "Arduino_LED_Matrix.h"   //Include the LED_Matrix library

//https://ledmatrix-editor.arduino.cc/
#include "closed_animation_sliding.h"

ArduinoLEDMatrix matrix;  

void setup() {
  matrix.begin(); 

}

void loop() {
  matrix.loadFrame(closed_animation_sliding[0]); 
  delay(300);
  matrix.loadFrame(closed_animation_sliding[1]);
  delay(300);
  matrix.loadFrame(closed_animation_sliding[2]);
  delay(300);
  matrix.loadFrame(closed_animation_sliding[3]);
  delay(300);
  matrix.loadFrame(closed_animation_sliding[4]);
  delay(300);
  matrix.loadFrame(closed_animation_sliding[5]);
  delay(300);
  matrix.loadFrame(closed_animation_sliding[6]); 
  delay(300);
  matrix.loadFrame(closed_animation_sliding[7]);
  delay(300);
  matrix.loadFrame(closed_animation_sliding[8]);
  delay(300);
  matrix.loadFrame(closed_animation_sliding[9]);
  delay(300);
  matrix.loadFrame(closed_animation_sliding[10]);
  delay(300);
  matrix.loadFrame(closed_animation_sliding[11]);
  delay(300);
  matrix.loadFrame(closed_animation_sliding[12]); 
  delay(300);
  matrix.loadFrame(closed_animation_sliding[13]);
  delay(300);
  matrix.loadFrame(closed_animation_sliding[14]);
  delay(300);
  matrix.loadFrame(closed_animation_sliding[15]);
  delay(300);
  matrix.loadFrame(closed_animation_sliding[16]);
  delay(300);
  matrix.loadFrame(closed_animation_sliding[17]);
  delay(300);
  matrix.loadFrame(closed_animation_sliding[18]); 
  delay(300);
  matrix.loadFrame(closed_animation_sliding[19]);
  delay(300);
  matrix.loadFrame(closed_animation_sliding[20]);
  delay(300);
  matrix.loadFrame(closed_animation_sliding[21]);
  delay(300);
  matrix.loadFrame(closed_animation_sliding[22]);
  delay(300);
  matrix.loadFrame(closed_animation_sliding[23]);
  delay(300);
    matrix.loadFrame(closed_animation_sliding[24]); 
  delay(300);
  matrix.loadFrame(closed_animation_sliding[25]);
  delay(300);
  matrix.loadFrame(closed_animation_sliding[26]);
  delay(300);
  matrix.loadFrame(closed_animation_sliding[27]);
  delay(300);
  matrix.loadFrame(closed_animation_sliding[28]);
  delay(300);
  matrix.loadFrame(closed_animation_sliding[29]);
  delay(300);
  matrix.loadFrame(closed_animation_sliding[30]); 
  delay(300);
  matrix.loadFrame(closed_animation_sliding[31]);
  delay(300);
  matrix.loadFrame(closed_animation_sliding[32]);
  delay(300);
  matrix.loadFrame(closed_animation_sliding[33]);
  delay(300);
  matrix.loadFrame(closed_animation_sliding[34]);
  delay(300);
  matrix.loadFrame(closed_animation_sliding[35]);
  delay(300);
  matrix.loadFrame(closed_animation_sliding[36]); 
  delay(300);
  matrix.loadFrame(closed_animation_sliding[37]);
  delay(300);
  matrix.loadFrame(closed_animation_sliding[38]);
  delay(300);
  matrix.loadFrame(closed_animation_sliding[39]);
  delay(300);
  matrix.loadFrame(closed_animation_sliding[40]);
  delay(300);
  matrix.loadFrame(closed_animation_sliding[41]);
  delay(300);
  matrix.loadFrame(closed_animation_sliding[42]); 
  delay(300);
  matrix.loadFrame(closed_animation_sliding[43]);
  delay(300);
  matrix.loadFrame(closed_animation_sliding[44]);
  delay(300);
  matrix.loadFrame(closed_animation_sliding[45]);
  delay(300);
 
}

#include "Arduino_LED_Matrix.h"   //Include the LED_Matrix library

//https://ledmatrix-editor.arduino.cc/
#include "closed_animation_sliding.h"

ArduinoLEDMatrix matrix;  

void setup() {
  matrix.begin(); 
}

void showFrame() {
    static uint32_t timeRef = millis();
    static uint16_t interval = 0; // intervallo di tempo tra un frame e il successivo
    static uint8_t frameIdx = 0; // indice del frame 0÷45
    if (millis() - timeRef >= interval) {
        interval = 300;   // adesso vale 300
        timeRef = millis();
        // esegue il 45 esimo frame e dopo frameIdx vale 46
        matrix.loadFrame(closed_animation_sliding[frameIdx++]);
        // riporta frameIdx a 0
        frameIdx = frameIdx % 46;
    }
}

void loop() {
    showFrame();

}

Intanto prova quello sopra se funziona correttamente.
Se funziona, adesso è non "bloccante" e ti dovrebbe venire più semplice
integrare l'altro sketch a questo non "bloccante".

Ciao.

1 Like

grazie, lo provo subito.

putroppo mi dà questi errori in compilazione :zany_face: :

:\Users\massi\AppData\Local\Temp\.arduinoIDE-unsaved2025327-13324-tc1thl.35i1\sketch_apr27a\sketch_apr27a.ino: In function 'void showFrame()':
C:\Users\massi\AppData\Local\Temp\.arduinoIDE-unsaved2025327-13324-tc1thl.35i1\sketch_apr27a\sketch_apr27a.ino:14:12: error: 'uin16_t' does not name a type; did you mean 'uint16_t'?
     static uin16_t interval = 0; // intervallo di tempo tra un frame e il successivo
            ^~~~~~~
            uint16_t
C:\Users\massi\AppData\Local\Temp\.arduinoIDE-unsaved2025327-13324-tc1thl.35i1\sketch_apr27a\sketch_apr27a.ino:16:31: error: 'interval' was not declared in this scope
     if (millis() - timeRef >= interval) {
                               ^~~~~~~~
C:\Users\massi\AppData\Local\Temp\.arduinoIDE-unsaved2025327-13324-tc1thl.35i1\sketch_apr27a\sketch_apr27a.ino:16:31: note: suggested alternative: 'Serial'
     if (millis() - timeRef >= interval) {
                               ^~~~~~~~
                               Serial
exit status 1

Compilation error: 'uin16_t' does not name a type; did you mean 'uint16_t'?

Ti consiglierei di sforzarti un minimo: almeno prova a leggerei cosa ti segnala il computer. Il compilatore ti sta chiaramente comunicando che hai sbagliato a dichiarare un tipo di dato. Hai scritto "uin16_t" per la variabile "interval", ma la dichiarazione corretta è "uint16_t".

1 Like

Hai ragione, io pensavo fosse una variabile particolare, ancora non dimestichezza con i commenti dell'IDE.

1 Like

grazie, funziona adesso, perfettamente, hai documentazione su come creare animazioni matrix come queste ?

Scusa la t mancante mi è rimasta nella tastiera. :grin:

No, cioè io non conosco affatto la UNO R4, né tanto meno le librerie che stai usando.
Posso dirti solo che interval può essere un array di 45 elementi di tipo uint16_t, in questo modo per ogni frame puoi specificare il tempo.

Ciao.

in pratica vi mostro il progetto che sto realizzando, per adesso sono riuscito a ottimizzare il codice per l'uso tramite uno slider via cloud di arduino, adesso ci devo aggiungere la scritta sul diplay led matrix closed quando il servo si aziona da 0 a 180°.

Arduino uno r4 apri porta

di seguito i due sketches che dovrei unire in uno che funzioni quando il servo ruota da 0 a 180°, ho provato a modificare ma gli errori sono molteplici e ancora non riesco a risolverli.

# include <Servo.h>
Servo myServo;

const int SwitchPin = 8;
byte butLst;
int  butCnt;


void setup ()
{
    Serial.begin (9600);
    pinMode (SwitchPin, INPUT_PULLUP);
    butLst = digitalRead (SwitchPin);
    myServo.attach (9);
}

void loop ()
{
    byte but = digitalRead (SwitchPin);
    if (butLst != but)  {   // change
        butLst = but;
        delay (20);         // debounce

        if (LOW == but)  {  // press
            butCnt++;
            Serial.println (butCnt);
            if (butCnt % 2)
                myServo.write (180);     // odd
            else
                myServo.write (0);      // even
        }
    }
}



#include "Arduino_LED_Matrix.h"   //Include the LED_Matrix library

//https://ledmatrix-editor.arduino.cc/
#include "closed_animation_sliding.h"

ArduinoLEDMatrix matrix;  

void setup() {
  matrix.begin(); 
}

void showFrame() {
    static uint32_t timeRef = millis();
    static uint16_t interval = 0; // intervallo di tempo tra un frame e il successivo
    static uint8_t frameIdx = 0; // indice del frame 0÷45
    if (millis() - timeRef >= interval) {
        interval = 300;   // adesso vale 300
        timeRef = millis();
        // esegue il 45 esimo frame e dopo frameIdx vale 46
        matrix.loadFrame(closed_animation_sliding[frameIdx++]);
        // riporta frameIdx a 0
        frameIdx = frameIdx % 46;
    }
}

void loop() {
    showFrame();

}

Non essendoci elementi bloccanti, dovrebbero funzionare insieme. Naturalmente, devi mettere tutto in un solo setup() e in un solo loop().

#include <Servo.h>
#include <Arduino_LED_Matrix.h>
#include "closed_animation_sliding.h"

ArduinoLEDMatrix matrix;  

Servo myServo;

const int SwitchPin = 8;
byte butLst;
int  butCnt;

void setup ()
{
    Serial.begin (9600);
    pinMode (SwitchPin, INPUT_PULLUP);
    butLst = digitalRead (SwitchPin);
    myServo.attach (9);
    matrix.begin(); 
}
void showFrame() {
    static uint32_t timeRef = millis();
    static uint16_t interval = 0; // intervallo di tempo tra un frame e il successivo
    static uint8_t frameIdx = 0; // indice del frame 0÷45
    if (millis() - timeRef >= interval) {
        interval = 300;   // adesso vale 300
        timeRef = millis();
        // esegue il 45 esimo frame e dopo frameIdx vale 46
        matrix.loadFrame(closed_animation_sliding[frameIdx++]);
        // riporta frameIdx a 0
        frameIdx = frameIdx % 46;
    }
}

void loop ()
{

    byte but = digitalRead (SwitchPin);
    if (butLst != but)  {   // change
        butLst = but;
        delay (20);         // debounce

        if (LOW == but)  {  // press
            butCnt++;
            Serial.println (butCnt);
            if (butCnt % 2)
                myServo.write (180);     // odd
                showFrame();

    }        else
                myServo.write (0);      // even
        }
    }

}

'''



C:\Users\massi\Documents\Arduino\sketch_apr26efunziona_copy_20250428160845\sketch_apr26efunziona_copy_20250428160845.ino:54:1: error: expected declaration before '}' token
 }
 ^
Più di una libreria trovata per "Servo.h"
  Usata: C:\Users\massi\Documents\Arduino\libraries\Servo
  Non usata: C:\Users\massi\AppData\Local\Arduino15\libraries\Servo
exit status 1

Compilation error: expected declaration before '}' token

ho provato il merge, mi dà questo errore nella compilazione, non riesco a decifrarlo ;

  • Il loop() ha 3 graffe aperte e 4 chiuse!
  • Hai due librerie servo installate, di cui una viene ignorata.
1 Like

sembra una cavolata ma adesso ho capito come funzionano gli errori della compilazione, grazie.

#include <Servo.h>
#include <Arduino_LED_Matrix.h>
#include "closed_animation_sliding.h"

ArduinoLEDMatrix matrix;  

Servo myServo;

const int SwitchPin = 8;
byte butLst;
int  butCnt;

void setup ()
{
    Serial.begin (9600);
    pinMode (SwitchPin, INPUT_PULLUP);
    butLst = digitalRead (SwitchPin);
    myServo.attach (9);
    matrix.begin(); 
}
void showFrame() {
    static uint32_t timeRef = millis();
    static uint16_t interval = 0; // intervallo di tempo tra un frame e il successivo
    static uint8_t frameIdx = 0; // indice del frame 0÷45
    if (millis() - timeRef >= interval) {
        interval = 300;   // adesso vale 300
        timeRef = millis();
        // esegue il 45 esimo frame e dopo frameIdx vale 46
        matrix.loadFrame(closed_animation_sliding[frameIdx++]);
        // riporta frameIdx a 0
        frameIdx = frameIdx % 46;
    }
}

void loop ()
{

    byte but = digitalRead (SwitchPin);
    if (butLst != but)  {   // change
        butLst = but;
        delay (20);         // debounce
        showFrame();

        if (LOW == but)  {  // press
  
            butCnt++;
            Serial.println (butCnt);
            if (butCnt % 2)
                myServo.write (180);     // odd

    }        else
    
                myServo.write (0);      // even
                     
        }
    }





questo è lo psuedo merge, ma non dà il risultato sperato, il servo non si muove e la scritta si muove un frame alla volta quando premo il pulsante, frizzata.

Prima di postare premi CTRL+T nell'IDE Arduino, questo comando "formatta il testo" allineando le graffe, ciò rende il codice più comprensibile.

La funzione showFrame() non si ferma mai, raggiunto il 45 esimo frame riparte dal frame zero. Ti serve fermarla raggiunto il 45 esimo frame?

Comunque, sicuramente ti serve una variabile globale di nome enableAnimation inizializzata a false, cioè: bool enableAnimation = false;

void loop ()
{
    if (enableAnimation == true) {
         showFrame();
    }
    byte but = digitalRead (SwitchPin);
    if (butLst != but)  {   // change
        butLst = but;
        delay (20);         // debounce

        if (LOW == but)  {  // press
            butCnt++;
            Serial.println (butCnt);
            if (butCnt % 2) { // {} è un blocco di codice 
                myServo.write (180);     // odd
                enableAnimation = true;  // abilita l'animazione
            }  else {
                myServo.write (0);      // even
                enableAnimation = false; // disabilita l'animazione
            }
        }
    }
}

PS: occhio che l'ultimo codice che hai postato anche se compila non mi
sembra corretto dal punto di vista logico a causa delle graffe.
Ciao.