Go Down

Topic: Aiuto Arduino pro micro: plugin joystick e potenziometro impazzito (Read 114 times) previous topic - next topic

Gh0st91

Ciao a tutti ragazzi, mi sono appena iscritto! (devo trovare la sezione apposita per potermi presentare) ho bisogno di realizzare un freno a mano per i simulatori di guida e nonostante i tanti topic non sono riuscito a risolvere il mio problema.
Ho caricato il plug in del joystick nella directory di Arduino, ho incollato questo script seguendo una nota guida:
Code: [Select]
// Analog eBrake-Handbrake
// PIN A0 to 10k pot output - Throttle Axis
// Use with Arduino ProMicro.
// Tested and working in DiRT RALLY + ASSETTO CORSA
// by AMSTUDIO
// 20.1.2017

#include <Joystick.h>

void setup()

{pinMode(A0, INPUT);
   Joystick.begin();}

const int pinToButtonMap = A0;

void loop()

{int pot = analogRead(A0);
int mapped = map(pot,0,1023,0,255);
{Joystick.setThrottle(mapped);}}


Il problema è che una volta salvato, andando nel pannello di controllo di windows, il segnale sembra abbia interferenze perchè vedo l'analogico muoversi all'impazzata senza che io tocchi nulla, idem dopo una calibrazione. Lo fa anche se stacco fisicamente il potenziometro da Arduino.

Qualcuno saprebbe dirmi se è difettosa la scheda, se ho saldato male o se può essere il potenziometro difettoso? (sperando che un nuovo potenziometro possa risolvere tutto dopo la calibrazione)

Magari il segnale da i numeri semplicemente perchè non viene rilevato il potenziometro e quindi la calibrazione non avviene correttamente..

Qualcuno che possa aiutarmi?

gpb01

Buongiorno,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione tutto il su citato REGOLAMENTO ... Grazie. :)

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. ;)
Search is Your friend ... or I am Your enemy !

gpb01

Se lasci non collegato un pin analogico di Ardunio, quando andai a leggerlo troverai i valori più strani dato che, un pin analogico, è un pin in INPUT con un altissima impedenza e quindi risente di qualsiasi disturbo ambientale.

Detto questo, metti lo schema elettrico esatto che TU stai utilizzando ... va bene anche disegnato a penna e poi fotografato, purché sia chiaro e dettagliato :)

Guglielmo

P.S.: Quel codice è pessimamente indentato ... usa la funzione del IDE che trovi tra gli "Strumenti", "Formattazione Automatica" per renderlo "decente" ;)
Search is Your friend ... or I am Your enemy !

docdoc

Oltre al consiglio di Guglielmo volevo aggiungere qualche considerazione e consiglio.

Intanto se non indenti bene rischi di non riuscire a comprendere bene il flusso del programma. Non parlo di questo programma perché semplicissimo (e mi pare di aver capito che non l'hai fatto tu...), ma se ti abitui dall'inizio a scrivere correttamente ti troverai meglio in futuro con cose più complesse. Per indentare automaticamente c'è quel comando che ti ha indicato Guglielmo, ma si attiva anche premendo Ctrl-T.

Poi mi pare di capire che chi lo ha scritto non abbia poi molta esperienza di programmazione in C/C++ perché vedo graffe quasi "a caso", ad esempio in:
Code: [Select]
{int pot = analogRead(A0);
int mapped = map(pot,0,1023,0,255);
{Joystick.setThrottle(mapped);}}

la graffa che racchiude il comando setThrottle è inutile perché i comandi interni ad una coppia di graffe sono già un blocco che verrà eseguito in sequenza.
Non è necessario mettere le graffe in ogni comando, quindi basta scrivere (qui ti inizio a dare un senso dell'indentazione):

Code: [Select]
void loop()
{
  int pot = analogRead(A0);
  int mapped = map(pot,0,1023,0,255);
  Joystick.setThrottle(mapped);
}


Poi è definita una costante per configurare il pin da leggere:

const int pinToButtonMap = A0;

ma poi non la usa mai. Va benissimo mettere variabili o costanti di configurazione ma poi vanno usate :) e comunque ti consiglio non solo di assegnare un nome più significativo possibile, ma anche sempre di metterle all'inizio del codice, per rendere più semplice la loro gestione.

Poi per gli input analogici non è necessario fare pinMode() in quanto sono sempre in input.

Per finire, la loop() viene eseguita moltissime volte al secondo, non credo che ti serva avere una tale risoluzione (oltre al fatto che può dare problemi di coerenza dei dati letti, ma ne parleremo più avanti), forse ti basta avere una decina di letture al secondo, e per fare questo basta fare una pausa di 100 millisecondi ad ogni ciclo.

Per cui, riassumo tutto in una cosa del genere:

Code: [Select]
// Analog eBrake-Handbrake
// PIN A0 to 10k pot output - Throttle Axis
// Use with Arduino ProMicro.
// Tested and working in DiRT RALLY + ASSETTO CORSA
// by AMSTUDIO
// 20.1.2017
#include <Joystick.h>

//  Configurazione:
// Pin del potenziometro
const int pinThrottle = A0;
// Pausa tra letture
const int ritardo = 100;

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

void loop()
{
  int pot = analogRead(pinThrottle);
  int mapped = map(pot,0,1023,0,255);
  Joystick.setThrottle(mapped);
  delay(ritardo); // Pausa
}
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

Go Up