Salve a tutti i partecipanti del forum, siate clementi con me poichè è la mia prima pubblicazione che effettuo e sono alle prime esperienze di programmazione.
Mi sono presentato qualche giorno fa sul forum con il nick Lollo65, spero di averlo inserito nella sezione giusta.
Veniamo al sodo vi spiego la mia esigenza:
Vorrei realizzare un contamarce per la mia moto. Su internet e sul sito ne ho trovati di diversi tipologie.
Infattio un primo contamarce che ho realizzato utilizzava un contatore up/dwn cd4029 ed un diplsy TIL311 capace di conatre in esadecimale; pero cio che non mi piaceva era lindicazione F quando la moto è in folle.
Io, però, volevo far indicare al mio contatore la lettera N (neutral) quando la moto è in Folle e ho aggiunto al primo contatore un Intersil 7243 riuscendo nell'impresa di fargli indicare la lettera N ma le dimensioni del circuito diventano troppo gradi per piazzarlo sulla moto.
Poi sono caduto nell'immenso modo di Arduino e girovagando in questo mondo ho trovato alcuni proggetti di contamarce per auto e moto ma aime essendo Io un anziano signore che ha rispolverato l'elettronica logica ho trovato enormi difficolta a comprendere il linguaggio di programmazione per arduino.
Però essendo io caparpio e determinato ho cominciato a comprendere come funzionavano i vari sketch dei proggetti per contamarce e ne ho adattoato uno alle mie esigenze.
Comprendo che il contamarce è un proggettino assai semplice in confronto a d altri molto più complessi
ma nel mio sketch ce qualcosa che mi sfugge e non capisco dove è l'errore.
Come interruttori uso due sensori magnetici effetto Hall NO con logica da alto a basso a sono applicati algli ingressi analogici A1 e A2 ed impostati con ingressi digitali.
L'A0 invece è utilizzato sempre come ingresso digitale e applicato direttamente allo switch neutral della moto.
Le funzioni base che arduino deve eseguire sono:
All'accensione del quadro strumenti della moto deve indicare la lettera N e questo lo esegue poiche il selettore delle marce è in posizione neutral .
Accesa la moto premo la frizione ed inserisco la 1ma marcia e qui nascono delle indecisioni di arduino che non capisco alcune volte per far indicare il nr 1 devo passare il magnete davanti al sensore Dwn 2 volte.
Continuo passandi il magnete sul sensore Up e arduino comincia a contare la sequenza 1,2,3,5,6.
non so per quale motivo salta il nr 4. Questo incoveniente lo ho risolto
Rimane il problema di :
Realizzato il circuito su B/B Il tutto sembra funziona correttamente, Accendo la Moto il selettore marce è su neutral e la lettera N viene visualizzata sul display.
L'unico inconvenniete lo riscontro quando dal Neutral devo passare alla 1ma marcia, quindi passo il magnete sul sensore DWN ma L'arduino non ne vuole sapere di indicare il nr 1 e rimane visualizzata la lettera N.
Se invece di passare il magnete sul sensore DWN lo passo sul sensore UP arduino indica il Nr 2 come se fosse stata inserita la 2nda marcia se prosego con le pigiate su UP arriva fino alla 6sta marcia.
Poi passo sul sensore DWN ed il conteggio arriva fino alla prima marcia, il nr 1 viene indicato sul dipslay.
qui di seguito ce lo sketch:
// uso degli ing analogici come ing digitali
// A0,A1,A2, siano definiti 14,15,16
// Contamarce, o meglio definito, indicatore di marcia inserita.
// Hardware utilizzato per test:
// Arduino UNO R3 made in cina
// Due finecorsa magnetici a tre poli (NO)
// display alphanumerico Rosso 16seg Kcom con Resistenza da 330
//
// Sketch di base scritto da rikip98
// Adattato da Lollo65
//
// definizione ingressi sensori
#define A2_giu 16 // pin interruttore di marcia giu
#define A1_su 15 // pin intterruttore di marcia su
#define A0_n 14 // pin segnale folle
//definizione pin display
int ledPinA = 2; // LED connected to digital pin 2
int ledPinB = 3; // LED connected to digital pin 3
int ledPinC = 4; // LED connected to digital pin 4
int ledPinD = 5; // LED connected to digital pin 5
int ledPinE = 6; // LED connected to digital pin 6
int ledPinF = 7; // LED connected to digital pin 7
int ledPinG = 8; // LED connected to digital pin 8
int ledPinH = 9; // LED connected to digital pin 9
int ledPinL = 10; // LED connected to digital pin 10
int value = 0;
int val_n = 0;
int val_giu = 0;
int old_val_giu = 0;
int val_su = 0;
int old_val_su = 0;
int state = 0;
int gear = 1;
int datoeeprom = 0;
void setup() {
pinMode(ledPinA, OUTPUT);
pinMode(ledPinB, OUTPUT);
pinMode(ledPinC, OUTPUT);
pinMode(ledPinD, OUTPUT);
pinMode(ledPinE, OUTPUT);
pinMode(ledPinF, OUTPUT);
pinMode(ledPinG, OUTPUT);
pinMode(ledPinH, OUTPUT);
pinMode(ledPinL, OUTPUT);
pinMode(A1_su, INPUT);
pinMode(A2_giu, INPUT);
pinMode(A0_n, INPUT);
// initialize serial communication:
Serial.begin(9600);
}
void loop() {
if ( value == 1) {
numero_1;
gear == 1;
}
if (value == 2){
numero_2;
gear == 2;
}
if (value == 3){
numero_3;
gear == 3;
}
if (value == 4){
numero_4;
gear == 4;
}
if (value == 5){
numero_5;
gear == 5;
}
if (value == 6){
numero_6;
gear == 6;
}
val_n = digitalRead (A0_n);
if (val_n == LOW) {
lettera_n();
delay(0050);
}
val_su = digitalRead(A1_su);
if ((val_su == LOW) && (old_val_su == HIGH)) {
gear += 1;
setnum(gear);
delay(100);
}
old_val_su = val_su;
val_giu = digitalRead(A2_giu);
if ((val_giu == LOW) && (old_val_giu == HIGH)) {
gear -= 1;
setnum(gear);
delay(100);
}
old_val_giu = val_giu;
if (gear >= 6) {
gear = 6;
}
if (gear <= 1) {
gear = 1;
}
}
void lettera_n(){
digitalWrite(ledPinA, LOW);
digitalWrite(ledPinB, HIGH);
digitalWrite(ledPinC, HIGH);
digitalWrite(ledPinD, LOW);
digitalWrite(ledPinE, HIGH);
digitalWrite(ledPinF, HIGH);
digitalWrite(ledPinG, LOW);
digitalWrite(ledPinH, HIGH);
digitalWrite(ledPinL, HIGH);
}
void numero_1(){
digitalWrite(ledPinA, LOW);
digitalWrite(ledPinB, HIGH);
digitalWrite(ledPinC, HIGH);
digitalWrite(ledPinD, LOW);
digitalWrite(ledPinE, LOW);
digitalWrite(ledPinF, LOW);
digitalWrite(ledPinG, LOW);
digitalWrite(ledPinH, LOW);
digitalWrite(ledPinL, LOW);
}
void numero_2(){
digitalWrite(ledPinA, HIGH);
digitalWrite(ledPinB, HIGH);
digitalWrite(ledPinC, LOW);
digitalWrite(ledPinD, HIGH);
digitalWrite(ledPinE, HIGH);
digitalWrite(ledPinF, LOW);
digitalWrite(ledPinG, HIGH);
digitalWrite(ledPinH, LOW);
digitalWrite(ledPinL, LOW);
}
void numero_3(){
digitalWrite(ledPinA, HIGH);
digitalWrite(ledPinB, HIGH);
digitalWrite(ledPinC, HIGH);
digitalWrite(ledPinD, HIGH);
digitalWrite(ledPinE, LOW);
digitalWrite(ledPinF, LOW);
digitalWrite(ledPinG, HIGH);
digitalWrite(ledPinH, LOW);
digitalWrite(ledPinL, LOW);
}
void numero_4(){
digitalWrite(ledPinA, LOW);
digitalWrite(ledPinB, HIGH);
digitalWrite(ledPinC, HIGH);
digitalWrite(ledPinD, LOW);
digitalWrite(ledPinE, LOW);
digitalWrite(ledPinF, HIGH);
digitalWrite(ledPinG, HIGH);
digitalWrite(ledPinH, LOW);
digitalWrite(ledPinL, LOW);
}
void numero_5(){
digitalWrite(ledPinA, HIGH);
digitalWrite(ledPinB, LOW);
digitalWrite(ledPinC, HIGH);
digitalWrite(ledPinD, HIGH);
digitalWrite(ledPinE, LOW);
digitalWrite(ledPinF, HIGH);
digitalWrite(ledPinG, HIGH);
digitalWrite(ledPinH, LOW);
digitalWrite(ledPinL, LOW);
}
void numero_6(){
digitalWrite(ledPinA, HIGH);
digitalWrite(ledPinB, LOW);
digitalWrite(ledPinC, HIGH);
digitalWrite(ledPinD, HIGH);
digitalWrite(ledPinE, HIGH);
digitalWrite(ledPinF, HIGH);
digitalWrite(ledPinG, HIGH);
digitalWrite(ledPinH, LOW);
digitalWrite(ledPinL, LOW);
}
void setnum (int number){
switch (number){
case 1:
numero_1();
break;
case 2:
numero_2();
break;
case 3:
numero_3();
break;
case 4:
numero_4();
break;
case 5:
numero_5();
break;
case 6:
numero_6();
break;
}
}
potrei allegar un video ma le dimensioni in Mb non lo consentono.
Grazie a tutti coloro che vogliano aiutarmi o darmi indicazioni sul come risolvere il problemino.
Saluti a tutti Lorenzo