Salve a tutti,sto terminando un mio progetto riguardante la costruzione di un robot che schiverà ostacoli attraverso un sensore di prossimità ad ultrasuon due motori 12v alimentati tramite alimentazione esterna con un doppio ponte H,fino a qui lo sketch procede che è una meraviglia, poi però ho provato ad incorporare un' LCD e il modulo audio lpm11162. Nel programma lo schermo dovra scrivere se sta andando dritto sterza o è fermo, mentre il modulo lo dirà, il problema sorge quando non mi bastano più i pin digitali, ho saputo che quelli analogici potevano essere utilizzati come digitali, ma come?
Lo sketch:
#include <SoftwareSerial.h>
#include <LPM11162.h>
#define LPM11162_RX 15 //Arduino TX (out)
#define LPM11162_TX 16 //Arduino RX (in)
#define LPM11162_RESET 17 //(out)
#define LPM11162_BUSY 18 //(in)
LPM11162 audio(LPM11162_RX,
LPM11162_TX,
LPM11162_RESET,
LPM11162_BUSY);
long duration;
long dursx;
long durdx;
const int en1 = 11; //pin enable
const int en2 = 9;
const int m1fd = 4; //controlli motore
const int m2fd = 7;
const int m1bk = 2;
const int m2bk = 6;
const int pinping = 13; //pin sensore distanza
const int sterzo = 600; //durata dello sterzo
const int distanza = 500; //distanza minima ostacoli
int motore1 = 67;//pwm motore dx
int motore2 = 74;//pwm motore sx
/*
LiquidCrystal Library - Hello World
const int LCD RS pin to digital pin 12
const int LCD Enable pin to digital pin 10
const int LCD D4 pin to digital pin 3
const int LCD D5 pin to digital pin 8
const int LCD D6 pin to digital pin 5
const int LCD D7 pin to digital pin 14
const int LCD R/W pin to ground
const int 10K resistor:
const int ends to +5V and ground
const int wiper to LCD VO pin (pin 3)
*/
// include the library code:
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 10, 3, 8, 5, 14);
void setup() {
pinMode(m1fd, OUTPUT);
pinMode(m1bk, OUTPUT);
pinMode(m2fd, OUTPUT);
pinMode(m2bk, OUTPUT);
pinMode(en1, OUTPUT);
pinMode(en2, OUTPUT);
analogWrite(en1,motore1);
analogWrite(en2,motore2);
dritto();
{
if ( audio.synch() )
{
audio.bridge();
}
audio.begin(9600);
audio.volume(50);
}
}
void loop() {
if (echo() < distanza){ //trovato un ostacolo
analogWrite(en1,170);
analogWrite(en2,170);
ferma();
sinistra();
delay(sterzo);
ferma();
dursx = echo(); //guarda a sinistra
destra();
delay(sterzo*2);
ferma();
durdx = echo(); //guarda a destra
if (dursx < distanza && durdx < distanza){
destra();
delay(sterzo);
} else if (dursx > durdx) {
sinistra();
delay(sterzo*2);
} //sceglie dove c'è più spazio
dritto();
analogWrite(en1,motore1);
analogWrite(en2,motore2);
}
}
void dritto() {
digitalWrite(m1bk,LOW);
digitalWrite(m2bk,LOW);
digitalWrite(m2fd,HIGH);
digitalWrite(m1fd,HIGH);
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.print("Sono,Porcibot,.,.,.,sterminare!");
{
audio.play("void dritto.wav");
while( audio.isBusy() );
delay( 2000 );
}
}
void rovescia() {
digitalWrite(m1fd,LOW);
digitalWrite(m2fd,LOW);
digitalWrite(m1bk,HIGH);
digitalWrite(m2bk,HIGH);
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.print("Stò,effettuando,un,inversione,di,marcia!");
{
audio.play("void rovescia.wav");
while( audio.isBusy() );
delay( 2000 );
}
}
void destra() {
digitalWrite(m1fd,LOW);
digitalWrite(m2fd,HIGH);
digitalWrite(m1bk,HIGH);
digitalWrite(m2bk,LOW);
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.print("girare,a,destra!");
{
audio.play("void destra.wav");
while( audio.isBusy() );
delay( 2000 );
}
}
void sinistra() {
digitalWrite(m1fd,HIGH);
digitalWrite(m2fd,LOW);
digitalWrite(m1bk,LOW);
digitalWrite(m2bk,HIGH);
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.print("girare,a,sinistra!");
{
audio.play("void sinistra.wav");
while( audio.isBusy() );
delay( 2000 );
}
}
void ferma() {
digitalWrite(m1fd,LOW);
digitalWrite(m2fd,LOW);
digitalWrite(m1bk,LOW);
digitalWrite(m2bk,LOW);
delay(50);
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// Print a message to the LCD.
lcd.print("Spostati,ho,fretta!");
{
audio.play("void ferma.wav");
while( audio.isBusy() );
delay( 2000 );
}
}
long echo() {
pinMode(pinping, OUTPUT);
digitalWrite(pinping, LOW);
delayMicroseconds(2);
digitalWrite(pinping, HIGH);
delayMicroseconds(5);
digitalWrite(pinping, LOW);
pinMode(pinping, INPUT);
duration = pulseIn(pinping,HIGH);
return duration;
}
P.S. dato che è la mia prima volta con arduino non è che potreste dare un occhiata grossolana a tutto il codice al codice (so che vi chiedo troppo
Vi ringrazio gia da ora.
Fedrix