Hi guys.
I'm buiding a small tool to controll speed of a 24Vdc motor with arduino and MD03. I like to have a display where I can read Motor Speed, Current and temperature.
I can't move motor. Can you please help me on this issue? is a software or hardware problem?
THANKYOU for your answer and suggestions....
hardware is:
Arduino Leonardo,
MD03 H-bridge
display AMD1602U
this my code:
/*
nome sketch: sketchdisplay con controllo motore
versione: 1.0
autore: diego trevisan
data 30/11/12
hardware: arduino (leonardo); ponte H tipo: MD03; display: AMD1602U ;potenziometro 10Kohm; potenziometro 10Kohm
collegamenti hardware:
LCD AMD1602U - arduino
positivo - positivo
negativo - negativo
RX - digital 7 (come definito dalla variabile "txPin")
potenziometro impostazione velocitÃ
centrale - analogico 0 definito come "sensorValue"
1 estremo - 5volt;
2 estremo - centrale 2 potenziometro (trim)
potenziometro trim (per tarare lo zero)
centrale - 2 estremo potenziometro lettura angolo
un estremo - negativo
MD03 - arduino
+5V - positivo 5volt
GND - negativo
SCL - SCL
SDA - SDA
switch tutti e 4 su ON
MD03 USCITA
+V positivo alimentazione motore (max 24Vdc)
GND massa alimentazione motore
MOT motore
MOT motore
(se gira al contrario del desiderato, invertire i fili MOT tra loro)
*/
// inserisce 3 librerie di funzioni
#include "Wire.h"
#include "SoftwareSerial.h"
#define ADDRESS 0x58 // Address of MD03
#define SOFTREG 0x07 // Byte to read software
#define CMDBYTE 0x00 // Command byte
#define SPEEDBYTE 0x02 // Byte to write to speed register
#define TEMPREG 0x04 // Byte to read temprature
#define CURRENTREG 0x05 // Byte to read motor current
#define txPin 7 //definisce il pin 7 di arduino come pin di trasmissione dati (sarà usato per mandare dati al display)
byte direct = 1; // Stores what direction the motor should run in
int a, d; // assena il tipo di variabili a, d come numeri interi
int tspd,data; //assegna il tipo di variabile tspd com numero intero
int x; // x è la varialile necessaria per definire quanti gradi corrispondano i 5cm di escursione del potenziometro
int diametro; //è la variabile a cui è assegnato il valore in mm del diametro del tubo di rotazione
SoftwareSerial LCD = SoftwareSerial(0, txPin); //non mi è chiaro questo comando... arriva dalle librerie ma non l'ho capito
const int LCDdelay=100; // assegna alla variabile LCDdelay il valore di 100 (espresso in millisecondi, quindi 1/10 di secondo)
// definizione delle funzioni per la gestione dell'LCD
//funzione che crea il comando lcdPosition, serve per posizionare il cursore nella posizione riga,colonna scrivendo solo lcdPosition(riga,colonna)
void lcdPosition(int row, int col) {
LCD.write(0xFE); //command flag
LCD.write((col + row*64 + 128)); //position
delay(LCDdelay);
}
//crea la funzione clarLCD che pilisce il display
void clearLCD(){
LCD.write(0xFE); //command flag
LCD.write(0x01); //clear command.
delay(LCDdelay);
}
//crea la funziona backlightOn che accende la retroilluminazione del display
void backlightOn() { //turns on the backlight
LCD.write(0x7C); //command flag for backlight stuff
LCD.write(157); //light level.
delay(LCDdelay);
}
//crea la funziona backlightOff che spegne la retroilluminazione del display
void backlightOff(){ //turns off the backlight
LCD.write(0x7C); //command flag for backlight stuff
LCD.write(128); //light level for off.
delay(LCDdelay);
}
// funzione per spedire dati al modulo MD03
void sendData(byte reg, byte val){ // Function for sending data to MD03
Wire.beginTransmission(ADDRESS); // Send data to MD03
Wire.write(reg);
Wire.write(val);
Wire.endTransmission();
}
//definisce la variabile nextPrint quale numero e gli assegna il valore 0
unsigned long nextPrint = 0;
// qui inizia il programma vero e proprio, è formato da 2 parti, la prima "void setup" che viene eseguito solo una volta e "void loop" che viene eseguito all'infinito se arduino è alimentato
void setup() {
Serial.begin(9600); //inizializza la porta di comunicazione seriale a 9600 baud
Wire.begin(); //inizia il collegamento con l porta seriale
LCD.begin(9600); //inizializza la porta di comunicazione con l'LCD a 9600 baud
clearLCD(); // pulisce il display
backlightOn(); // accemde la luce di retroilluminazione
// backlightOff();
pinMode(txPin, OUTPUT); //dichiara che il txPin sarà di tipo output ovvero trasmetterà i dati al display. il txPin era stato impostato 4 precedentemente
lcdPosition(0,0); //posiziona il cursre nella riga 0 e colonna 0
LCD.print("Tspd"); // scrive il testo tra " "
lcdPosition(1,0); //posiziona il cursre nella riga 0 e colonna 0
LCD.print("mA "); // scrive il testo tra " "
lcdPosition(1,8); //posiziona il cursre nella riga 0 e colonna 0
LCD.print("Temp"); // scrive il testo tra " "
}
// inizia il ciclo che verrà eseguito per sempre quando arduino ha alimentazione
void loop() {
while (true) {
// read the input on analog pin 0:
int sensorValue = analogRead(A0);
// Convert the analog reading (which goes from 0 - 1023) to a value (-250,250):
tspd= (map(sensorValue,0,1023,-250,250)); //operazione necessaria in quanto si tratta di un partitore quindi la massima tensione è metà della tensione applicata
lcdPosition(0,5); //posiziona il cursore nella riga 0, colonna 5
LCD.print(" "); //scrive 3 spazi (essendo un loop, serve cancellare la precedente lettura, in realtà servirebbe cancellarla solo se la precedente lettura fosse di 3 cifre e l'attuale di 2)
lcdPosition(0,5); //posiziona il cursore nella riga 0, colonna 5//riga, colonna
LCD.print(tspd); // scrive il valore tspeed (target speed)
int current = analogRead(CURRENTREG); // Gets motor current
lcdPosition(1,3); //posiziona il cursore nella riga 1, colonna 5
LCD.print(" "); //scrive 3 spazi (essendo un loop, serve cancellare la precedente lettura, in realtà servirebbe cancellarla solo se la precedente lettura fosse di 3 cifre e l'attuale di 2)
lcdPosition(1,3); //posiziona il cursore nella riga 1, colonna 5//riga, colonna
LCD.print(current); // scrive il valore current (corrente assorbita dal motore)
int temp = analogRead(TEMPREG);
lcdPosition(1,13); //posiziona il cursore nella riga 1, colonna 5
LCD.print(" "); //scrive 3 spazi (essendo un loop, serve cancellare la precedente lettura, in realtà servirebbe cancellarla solo se la precedente lettura fosse di 3 cifre e l'attuale di 2)
lcdPosition(1,13); //posiziona il cursore nella riga 1, colonna 5//riga, colonna
LCD.print(TEMPREG); // scrive il valore tempreg (temperatura regolatore)
sendData(SPEEDBYTE, tspd); //invia al modulo MD03 il comando per la velocità target tspd
}
}