Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Problema servocomando

Elettronica lineare e digitale: didattica ed applicazioni

Moderatori: Foto UtenteBrunoValente, Foto UtenteDirtyDeeds, Foto Utentecarloc, Foto UtenteIsidoroKZ, Foto Utenteg.schgor

0
voti

[31] Re: Problema servocomando

Messaggioda Foto Utentec1b8 » 12 nov 2013, 15:23

Il codice si potrebbe modificare in diversi modi, ma l'unica cosa che mi sento di dirti è che manca il posizionamento del servo nel momento in cui non premi pulsanti.
Se non premi pulsanti il segnale di controllo del servo rimane spento ed il servo incontrollabile.
Dovresti modificarlo in modo che la mancata pressione di un qualsiasi pulsante lo posizioni ad esempio al centro.

Il mio programma è scritto in assembly, se vuoi te lo mando lo stesso, dimmi tu.

fantamed ha scritto:#-o come si fa per darti il voto nel forum?

:ok: va bene così...
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

0
voti

[32] Re: Problema servocomando

Messaggioda Foto Utentefantamed » 12 nov 2013, 17:19

no in assembly ci capisco ancora meno del pochissimo C che conosco,grazie ugualmente
O_/
Avatar utente
Foto Utentefantamed
30 5
Frequentatore
Frequentatore
 
Messaggi: 110
Iscritto il: 8 nov 2013, 13:44

0
voti

[33] Re: Problema servocomando

Messaggioda Foto Utentec1b8 » 12 nov 2013, 17:38

Potresti provare a scriverlo tu in C.
Devi sfruttare l'interrupt del timer0, in questo modo hai maggiore precisione nelle tempistiche e non impegni il micro in delay che lo bloccano.
Nel corpo principale del programma, nel main e all'interno del while(1), vengono verificati solo i pulsanti, quando cambiano si modifica la variabile che dice alla routine di interrupt come posizionare il servo, ovvero dice quale durate deve avere il Ton del segnale di controllo.
Con un 16F84A a 4MHz potresti arrivare ad avere una precisione nei segnali generati di 4us per ogni servo.
Direi un'ottima precisione.
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

0
voti

[34] Re: Problema servocomando

Messaggioda Foto Utentefantamed » 12 nov 2013, 20:22

Ci voglio provare,con interrupt e led era andata bene,perche non provarci anche con il servo ;-)
c1b8 ha scritto:Se non premi pulsanti il segnale di controllo del servo rimane spento ed il servo incontrollabile.Dovresti modificarlo in modo che la mancata pressione di un qualsiasi pulsante lo posizioni ad esempio al centro.

Mi daresti qualche dritta su come fare?
sono riuscito a portarlo in posizione centrale solo quando accendo il circuito
Avatar utente
Foto Utentefantamed
30 5
Frequentatore
Frequentatore
 
Messaggi: 110
Iscritto il: 8 nov 2013, 13:44

0
voti

[35] Re: Problema servocomando

Messaggioda Foto Utentec1b8 » 12 nov 2013, 22:01

Per quanto riguarda il posizionamento del servo quando non premi i pulsanti farei così:
Codice: Seleziona tutto
    #include <PIC.h> // contiene i nomi mnemonici di registri e porte

    __CONFIG(0x3FF9);

    #define PIC_CLK 4000000 //4Mhz


    #include "delay.c"
    #include "settaggioservo.h" // file che contiene il settaggio delle porte


    unsigned char sel;
   
    void main(void)
    {
        settaggio();

        while(1) {
            sel = 0;
           
            if (PL1==0)                            //se premo pulsante 1
            {             
                sel = 1;
            }
            if (PL2==0)                                //se premo pulsante 2
            {
                sel = 2;
            }
            if (PL3==0)                                //se premo pulsante 3. Porto servo al centro come quando non premo
            {
                sel = 0;
            }

            switch (sel) {
            case 0:            // servo in posizione centrale
                LED=0;     // spengo led   
                SER1=1;                                  // segnale livello alto 1     
                for (i=0;i<6;i++)
                {                                           
                    DelayUs(250);                     //attesa  1.5 millisec. (per posizione centrale)
                }               
                SER1=0;                               // segnale livello basso 0         
                for (i=0;i<74;i++)
                {
                    DelayUs(250);                     // attesa 18,5 millisec.
                }               
                break;
               
            case 1:            // servo da un lato
                SER1=1;                          // segnale livello alto 1
                for (i=0;i<21;i++)
                {                                           
                    DelayUs(100);             //attesa  2.1 millisec.
                }                           
                SER1=0;                         // segnale livello basso 0         
                for (i=0;i<180;i++)
                {                                           
                    DelayUs(99);              //attesa  17.9 millisec.                  }                                                       
                }
                break;
               
            case 2:            // servo dall'altro lato
                LED=1;                         //accendo led
                SER1=1;                      // segnale livello alto 1
                for (i=0;i<6;i++)
                {                                           
                    DelayUs(100);         //attesa  0.6 millisec.
                }                                                   
                SER1=0;                     // segnale livello basso 0                               
                for (i=0;i<194;i++)
                {                                           
                    DelayUs(100);        // attesa 19.4 millisec.
                }                     
                break;
            }
        }
    }

Ammetto di non averlo provato.
In questo modo il pulsante3 o il non premere pulsati ha lo stesso effetto: led spento e servo al centro.
Gli altri 2 pulsanti accendono il led e portano il servo agli estremi opposti.
Prova.

Poi aspetto qualche considerazione sul come faresti per l'interrupt. Attento solo che non è semplicissimo, devi pensarci su un po': attento alla risoluzione, intesa come possibili valori del tempo Ton, che vuoi ottenere....
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

0
voti

[36] Re: Problema servocomando

Messaggioda Foto Utentefantamed » 13 nov 2013, 15:48

Ho provato e funziona benissimo,lo ho modificato aggiungendo switch per il secondo servo .
Ti spiego il kit e uguuale a questo:

http://www.ebay.com/bhp/camera-platform

quindi con il programma dovrei riuscire a manovrare i quattro movimenti, mi resta il problema che:
Quando accendo i 2 servi si posizionano in centro e va bene,,ma quando li sposto devrebbero rimanere dove li lascio,invece cosi tornano sempre in centro .
Se elimino( case 0)il servo resta dove lo lascio e dovendo fare uno minimo sforzo per muovere la telecamerina dovrebbe rimanere dove e ,poi sposto il ciclo della posizione centrale appena dopo settaggio(); e lo faccio eseguire una volta sola per il tempo di uno spostamento di 90°per sicurezza qualora il servo fosse tutto da un lato
Sinceramente avevo dato solo un'occhio alla funzione (switch),con il tuo esempio adesso ho capito come si usa ;-) potresti farmi un esempio di costante su questo programma cosi me la studio :mrgreen:
Se faccio cosi puo andare?
nuovo codice :oops:
Codice: Seleziona tutto
#include <PIC.h> // contiene i nomi mnemonici di registri e porte

    __CONFIG(0x3FF9);

    #define PIC_CLK 4000000 //4Mhz


    #include "delay.c"
    #include "settaggioservo.h" // file che contiene il settaggio delle porte


 
   
    void main(void)
    {
        settaggio();

        while(1) {
            sel1 = 0;
            sel2 = 0;
            if (PL1==0)                            //se premo pulsante 1
            {             
                sel1 = 1;
            }
            if (PL2==0)                                //se premo pulsante 2
            {
                sel1 = 2;
            }
            if (PL3==0)                                //se premo pulsante 3
            {
                sel2 = 3;
            }
            if (PL4==0)                                //se premo pulsante 4
            {
                sel2 = 4;
            }
            switch (sel1) {
            case 0:            // servo in posizione centrale
                LED=0;     // spengo led   
                SER1=1;   // segnale livello alto 1     
                for (i=0;i<6;i++)
                {                                           
                DelayUs(250);         //attesa  1.5 millisec. (posizione centrale)
                }               
                SER1=0;                               // segnale livello basso 0         
               
                for (i=0;i<74;i++)
                {
                    DelayUs(250);                     // attesa 18,5 millisec.
                }               
                break;
               
            case 1:            // servo da un lato
                LED=1;
                SER1=1;                          // segnale livello alto 1
                for (i=0;i<21;i++)
                {                                           
                    DelayUs(100);             //attesa  2.1 millisec.
                }                           
                SER1=0;                         // segnale livello basso 0         
                for (i=0;i<180;i++)
                {                                           
                    DelayUs(99);              //attesa  17.9 millisec.                  }                                                       
                }
                break;
               
            case 2:            // servo dall'altro lato
                LED=1;                         //accendo led
                SER1=1;                      // segnale livello alto 1
                for (i=0;i<6;i++)
                {                                           
                    DelayUs(100);         //attesa  0.6 millisec.
                }                                                   
                SER1=0;                     // segnale livello basso 0                               
                for (i=0;i<194;i++)
                {                                           
                    DelayUs(100);        // attesa 19.4 millisec.
                }                     
                break;
                }           
            switch (sel2) {
            case 0:            // servo in posizione centrale
                LED=0;     // spengo led                 
                SER2=1;                                  // segnale livello alto 1     
                for (i=0;i<6;i++)
                {                                           
                    DelayUs(250);                     //attesa  1.5 millisec. (per posizione centrale)
                }               
                                               // segnale livello basso 0         
                SER2=0;
                for (i=0;i<74;i++)
                {
                    DelayUs(250);                     // attesa 18,5 millisec.
                }               
                break;
         case 3:            // servo da un lato
                LED=1;
                SER2=1;                          // segnale livello alto 1
                for (i=0;i<21;i++)
                {                                           
                    DelayUs(100);             //attesa  2.1 millisec.
                }                           
                SER2=0;                         // segnale livello basso 0         
                for (i=0;i<180;i++)
                {                                           
                    DelayUs(99);              //attesa  17.9 millisec.                  }                                                       
                }
                break;

             case 4:            // servo dall'altro lato
                LED=1;                         //accendo led
                SER2=1;                      // segnale livello alto 1
                for (i=0;i<6;i++)
                {                                           
                    DelayUs(100);         //attesa  0.6 millisec.
                }                                                   
                SER2=0;                     // segnale livello basso 0                               
                for (i=0;i<194;i++)
                {                                           
                    DelayUs(100);        // attesa 19.4 millisec.
                }                     
                break;
            }
        }
    }

grazie O_/ buona giornata
Avatar utente
Foto Utentefantamed
30 5
Frequentatore
Frequentatore
 
Messaggi: 110
Iscritto il: 8 nov 2013, 13:44

0
voti

[37] Re: Problema servocomando

Messaggioda Foto Utentefantamed » 13 nov 2013, 15:57

per quanto riguarda gli interrupt ho recuperato l'esecizio che avevo fatto
Settaggio:
Codice: Seleziona tutto
#define LED1  RA2
#define LED2  RA3
#define LED3  RB3
#define LED4  RB4
#define LED5  RB5
#define LED6  RB6
#define LED7  RB7
#define PULS1 RB1
#define PULS2 RB2
#define PULS3 RB3
#define stlampg 250
unsigned char lampg=0,i;
void settaggio(void)
{
   TRISA=0;
   TRISB=0b00000111;
   
   OPTION=0b10000100;
   INTCON=0b10010000;
   TMR0=100;
   
}   


Programma:
Codice: Seleziona tutto
#define  XTAL_FREQ 20MHZ // questo è utilizzato dalle routine di ritardo contenute in Delay.C
#include <PIC.h> // contiene i nomi mnemonici di registri e porte
__CONFIG (XT & WDTDIS & PWRTEN & UNPROTECT);
#include "delay.c" // routine per ritardi
#include "settaggio3led.h"

void main (void)
{
  settaggio();
   while(1)
   {
      if(!PULS1)
      {
        DelayUs(100);
       if(!PULS1)
         {
           LED1=1;
           for(i=0;i<8;i++)
             {
              DelayUs(250);
            }
         }
       }   
     
    if(!PULS2)
       {
        DelayUs(100);
        if(!PULS2)
         {
           LED2=LED2^1;
          LED1=LED1^1;
         }
       }
   }
}   

void interrupt ISR (void)
{
  if(!PULS3)
   {
    TMR0=100;
     lampg++;
     if(lampg>=stlampg)
       {
         LED3=LED3^1;
       lampg=0;
       }
   INTF=0;
   }
 


Appena riesco ad isolarmi come si deve per non essere disturbato mi ci butto a capofitto e ci provo :ok:
Avatar utente
Foto Utentefantamed
30 5
Frequentatore
Frequentatore
 
Messaggi: 110
Iscritto il: 8 nov 2013, 13:44

0
voti

[38] Re: Problema servocomando

Messaggioda Foto Utentec1b8 » 13 nov 2013, 17:00

Ciao, devi perdornarmi ma oggi e domani sono presissimo e non riesco a scrivere codice.
Ho dato uno sguardo veloce a come hai modificato il programma, vorrei farti alcune domande/asservazioni e poi, in funzione delle risposte, vediamo come eventualmente modificarlo:
- se gestisci 4 pulsanti (2 per il servo1 e 2 per il servo2) come pensavi di gestire le 3 posizioni (centro, dx, sx) di ogni servo?
- così come è stato impostato il programma prevede solo posizioni fisse (dx, sx, ecc) per ogni servo, non consente è posizionamenti qualsiasi. E' quello che volevi?
- con quale velocità vuoi spostare i servo? oggi sis postano alla massima velocità loro consentita.
- per la variabile sel2 puoi gestire ancora i valori 0, 1 e 2. Non serve gestire valori 0, 3, 4 diversi dal sel1.

per il momento non mi viene in mente altro...
Fabio
Avatar utente
Foto Utentec1b8
3.595 3 8 13
G.Master EY
G.Master EY
 
Messaggi: 1770
Iscritto il: 15 gen 2009, 15:23

0
voti

[39] Re: Problema servocomando

Messaggioda Foto Utentefantamed » 13 nov 2013, 18:18

E no non e quello che vorrei 8-[
i pulsanti sono quattro, per quanto riguarda le tre posizioni,a questo punto mi conviene gestire solo dx e sx,poiche in centro ce lo porto io all'utilizzo oppure ci va da solo quando accendo il circuito.
per la velocita effettivamente e troppo veloce dovrei ridurla almeno alla metà,poi quando potro comprare la telecamerina vedro al momento che velocita occorre per avere un filmato decente quando la muovo
per la variabile sel2 ho aggiunto case 3 e 4 perché ho pensato che utilizzando nuovamente case 1 e 2 muovo lo stesso servo di sel1.

Grazie infinite per la disponibilità O_/
Avatar utente
Foto Utentefantamed
30 5
Frequentatore
Frequentatore
 
Messaggi: 110
Iscritto il: 8 nov 2013, 13:44

0
voti

[40] Re: Problema servocomando

Messaggioda Foto Utentefantamed » 14 nov 2013, 20:23

:-M "[#]" mannaggia e davvero molto dura,da solo non ci arrivo.
Avatar utente
Foto Utentefantamed
30 5
Frequentatore
Frequentatore
 
Messaggi: 110
Iscritto il: 8 nov 2013, 13:44

PrecedenteProssimo

Torna a Elettronica generale

Chi c’è in linea

Visitano il forum: Nessuno e 22 ospiti