DIY E-Bike

Una Nuova Filosofia

Le bici elettriche sono senza dubbio un mezzo interessante per muoversi in città. In molti paesi hanno preso piede, ma in Italia ancora non ne circolano molte, per vari motivi: dal prezzo all’idea “della bici per anziani”.

La nostra bici “Sportiva”

Noi abbiamo realizzato la nostra versione personalizzata di una bici elettrica “ad alte prestazioni” e senza compromessi. Le bici elettriche sono sia divertenti da costruire che da usare, per cui è stata realizzata interamente a mano (a parte il telaio riutilizzato), senza comprare kit pronti per essere installati, ma partendo da zero.

Video di presentazione


 

 

 

 

Specifiche

La bici è equipaggiata con un arduino nano, che ha i due ruoli principali di gestire il display e acquisire dati (analogoci) dal potenziometro, restituendo valori rielabortati all’ ESC (digitali). Il motore (qui il modello) è di tipo brushless , pilotato da un ESC da 60A. L’alimentazione è assicurata da 4 batterie 12v – 7.2 A/h lead-acid collegate in parallelo.


Caratteristiche

La bici in condizioni ideali può raggiungere senza pedalare – o comunque pedalando solo per avviare la bici, poi smettendo- i 28-32 Km/h, mentre l’autonomia dipende dall’uso che si fa dell’acceleratore al massimo, oppure facendo piccole soste e dosando bene la potenza si può arrivare anche a 10 Km. Il peso della bici è considerevole, già solo 8Kg per le batterie, e si fa sentire su percorsi difficili dove magari l’equilibrio è già messo a dura prova da un terreno accidentato con presenza di grossi sassi. La bici riconosce quando viene messa in carica e un timer ne controlla la durata (6 ore), staccando il carica batterie allo scadere. Il display mostra la velocità, il voltaggio delle batterie e i km percorsi.

Programma

Di seguito riporto il programma, che all’apparenza può sembrare un po’ contorto, ma in realtà non lo è. Siccome non era prevista una sua pubblicazione, non mi sono mai adoperato per renderlo leggibile, e potrebbe ancora contenere stralci di codice rimasti da prove precedenti e poi modificati. Il programma è comunque pienamente funzionante ed è, alla pubblicazione dell’articolo, quello caricato sulla bici. Per qualsiasi domanda vi invito ad usare la sezione commenti.


Gabriele Fiumicelli

Codice:

// include the library code:
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 8);
#include <Servo.h>
Servo myservo;
#include <elapsedMillis.h>
elapsedMillis timer;
elapsedMillis ricarica;
elapsedMillis timer_schermo;
elapsedMillis timer_motore;
elapsedMillis timer_sec;
//————–variabili—————–
char carattere[32]= {‘#’,’#’,’#’,’#’,’#’,’H’,’E’,’L’,’L’,’O’,’#’,’#’,’#’,’#’,’#’,’#’,’#’,’#’,’#’,’W’,’a’,’k’,’i’,’n’,’g’,’ ‘,’U’,’p’,’#’,’#’,’#’,’#’};
const int potpin = 0; // analog pin used to connect the potentiometer
int val; // variable to read the value from the analog pin
const float ruota = 2.050;//26×195 pneumatici
float speedKm = 0;
float battery_voltage;
const float MAX_VOLTAGE = 20.4142;
float charging_voltage;
boolean calamita = false;
boolean a = false;
long time_ricarica;
boolean ricarica_completata = false;
float tempo_rimanente;
float ruota2sec = 0;
float DIST = 0;
unsigned long lastturn = 0;
//———-programme————
void waking_up(){
timer=0;
for(int i=0; i<32; i++){
if (i==16){
lcd.setCursor(0,1);
}
lcd.print(carattere[i]);
delay(50);
//sigla avvio
if (timer<200)
analogWrite(10, 80);
if (timer > 200 and timer < 280)
analogWrite(10, 225);
if (timer > 280)
analogWrite(10, 0);
}
delay(1000);
lcd.clear();
}
void setup() {
// set up the LCD’s number of columns and rows:
lcd.begin(16, 2);
pinMode(2, INPUT);//speed magnete
pinMode(7, OUTPUT);//relè mototre(esc)
pinMode(6, OUTPUT);//relè caricatore
pinMode(10, OUTPUT);//buzzer
digitalWrite(7, HIGH);//attiva esc
pinMode(13, OUTPUT);
waking_up();
timer_schermo = 0;
Serial.begin(9600);
myservo.attach(9);
//schermo per la prima volta
float battery_voltage_temp = analogRead(A1);
battery_voltage = (battery_voltage_temp/1024)*20.4142;
charging_voltage = analogRead(A2);
charging_voltage = map(charging_voltage, 0, 1023, 0, MAX_VOLTAGE);
lcd.clear();
lcd.print(“void setup…”);
timer_schermo = 0;
timer = 0;
timer_motore = 0;
attachInterrupt(0,velocity,RISING);
}
void velocity(){
if (millis()-lastturn > 120) {
speedKm = ruota/((float)(millis()-lastturn)/1000)*3.6;
lastturn=millis();
DIST=DIST+ruota/1000;
timer=0;
}
}
void loop() {
if (a == false){
val = analogRead(potpin); // reads the value of the potentiometer (value between 0 and 1023)
val = map(val, 0, 1023, 1000, 2000); // scale it to use it with the servo (value between 1ms and 2ms)
myservo.writeMicroseconds(val); // sets the servo position according to the scaled value
// Serial.println(val);
if (val > 1800)
a = true;
}
else{
val = analogRead(potpin); // reads the value of the potentiometer (value between 0 and 1023)
val = map(val, 0, 1023, 1300, 2000); // scale it to use it with the servo (value between 1ms and 2ms)
myservo.writeMicroseconds(val);
// Serial.println(val);
}
// azzeramento speed
if (timer > 2500){
speedKm = 0;
timer = 0;
}
//aggiornamento schermo
if (timer_schermo > 800){
//voltaggi
float battery_voltage_temp = analogRead(A1);
battery_voltage = (battery_voltage_temp/1024)*MAX_VOLTAGE-0.8;//0.8 è una traslazione per aggiustare il valore
charging_voltage = analogRead(A2);
charging_voltage = map(charging_voltage, 0, 1023, 0, MAX_VOLTAGE);
lcd.clear();
lcd.print( speedKm, 1 );
lcd.print(” K/h”);
lcd.print(” D:”);
lcd.print(DIST, 1 );
lcd.print(“Km”);
lcd.setCursor(0,1);
lcd.print(“Battery:”);
lcd.print(battery_voltage,2);
lcd.print(“V”);
timer_schermo = 0;
//Serial.println(timer);
//analogWrite(10, 0);
//per test velocità
//digitalWrite(13, LOW);
}
// ricarica
if (charging_voltage > 9){
ricarica = 0;
digitalWrite(7, LOW);//disattiva esc
digitalWrite(6, HIGH);//attiva relè ricarica
do{
//sigla ricarica
if (ricarica<200)
analogWrite(10, 80);
if (ricarica > 200 and ricarica < 280)
analogWrite(10, 225);
if (ricarica > 280)
analogWrite(10, 0);
if (timer_schermo > 800){
lcd.clear();
lcd.print(“RICARICA “);
float battery_voltage_temp = analogRead(A1);
battery_voltage = (battery_voltage_temp/1024)*20.4142;
lcd.print(battery_voltage,2);
lcd.print(“V”);
lcd.setCursor(0,1);
lcd.print(“Rimanente: “);
time_ricarica = ricarica/1000;//trasforma in secondi
tempo_rimanente = ((21600-time_ricarica)/(float)60)/(float)60;
lcd.print(tempo_rimanente,2);
lcd.print(“h”);
timer_schermo = 0;
}
if (time_ricarica > 21600)//controlla il progresso della ricarica
ricarica_completata = true;
}while(ricarica_completata == false);
digitalWrite(6, LOW);//disattiva relè ricarica
do{
lcd.clear();
lcd.print(“RIC. COMPLETATA”);
lcd.setCursor(0,1);
lcd.print(“Riavviare..”);
float battery_voltage_temp = analogRead(A1);
battery_voltage = (battery_voltage_temp/1024)*20.4142;
lcd.print(battery_voltage,2);
lcd.print(“V”);
delay(60000);
}while(true);
}
}



Lascia un commento

%d blogger hanno fatto clic su Mi Piace per questo: