Segue programação do robô com IHM de LED (display max7219)
#include <MD_MAX72xx.h>
#include <SPI.h>
#define PRINT(s, v) { Serial.print(F(s)); Serial.print(v); }
//Define o tipo de hardware conectado
#define HARDWARE_TYPE MD_MAX72XX::FC16_HW
//Define o numero de dispositivos conectados
#define MAX_DEVICES 4
//Pinos de conexao do modulo no Arduino
#define CLK_PIN 8
#define DATA_PIN 4
#define CS_PIN 7
MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);
//Parametros de texto (espaco entre carecteres (em pixels))
#define CHAR_SPACING 1
//Tamanho do buffer de texto
#define BUF_SIZE 75
//Mensagem inicial
char message[BUF_SIZE] = "LEDs...";
bool newMessageAvailable = true;
int IN1 = 3; //define o pino 3 como IN2
int IN2 = 5; //define o pino 5 como IN2
int IN3 = 6; //define o pino 6 como IN3
int IN4 = 9; //define o pino 7 como IN4
//int entrada2 = 2; //define o pino 7 como IN4
//int e = 4; //define o pino 7 como IN4
//int IN4 = 7; //define o pino 7 como IN4
//int IN4 = 8; //define o pino 7 como IN4
int rele1 = 10; //define o pino 10 como rele
int rele2 = 11; //define o pino 11 como rele
int rele3 = 12; //define o pino 12 como rele
int rele4 = 13; //define o pino 13 como rele
int velocidade; //define velocidade como uma veriavel inteira
char sinal; //define sinal como uma veriavel do tipo caracter
char state; //define state como uma veriavel do tipo caracter
void readSerial(void)
{
//Rotina que realiza a leitura dos caracteres digitados no Serial Monitor
static uint8_t putIndex = 0;
while (Serial.available())
{
message[putIndex] = (char)Serial.read();
if ((message[putIndex] == '\n') || (putIndex >= BUF_SIZE - 3)) // end of message character or full buffer
{
message[putIndex] = '\0';
putIndex = 0;
newMessageAvailable = true;
}
else
message[putIndex++];
}
}
void printText(uint8_t modStart, uint8_t modEnd, char *pMsg)
//Mostra o texto no display
{
uint8_t state = 0;
uint8_t curLen;
uint16_t showLen;
uint8_t cBuf[8];
int16_t col = ((modEnd + 1) * COL_SIZE) - 1;
mx.control(modStart, modEnd, MD_MAX72XX::UPDATE, MD_MAX72XX::OFF);
do
{
switch (state)
{
case 0: // Load the next character from the font table
// if we reached end of message, reset the message pointer
if (*pMsg == '\0')
{
showLen = col - (modEnd * COL_SIZE); // padding characters
state = 2;
break;
}
// retrieve the next character form the font file
showLen = mx.getChar(*pMsg++, sizeof(cBuf) / sizeof(cBuf[0]), cBuf);
curLen = 0;
state++;
// !! deliberately fall through to next state to start displaying
case 1: // display the next part of the character
mx.setColumn(col--, cBuf[curLen++]);
// done with font character, now display the space between chars
if (curLen == showLen)
{
showLen = CHAR_SPACING;
state = 2;
}
break;
case 2: // initialize state for displaying empty columns
curLen = 0;
state++;
// fall through
case 3: // display inter-character spacing or end of message padding (blank columns)
mx.setColumn(col--, 0);
curLen++;
if (curLen == showLen)
state = 0;
break;
default:
col = -1; // this definitely ends the do loop
}
} while (col >= (modStart * COL_SIZE));
mx.control(modStart, modEnd, MD_MAX72XX::UPDATE, MD_MAX72XX::ON);
}
//_____________________________________________________VOID MAIN_____________________________________________________________
void setup() {
Serial.begin(9600);
pinMode(IN1, OUTPUT); //define o pino 4 como saida de informação
pinMode(IN2, OUTPUT); //define o pino 5 como saida de informação
pinMode(IN3, OUTPUT); //define o pino 6 como saida de informação
pinMode(IN4, OUTPUT); //define o pino 7 como saida de informação
pinMode(rele1, OUTPUT); //define o pino 10 como saida de informação
pinMode(rele2, OUTPUT); //define o pino 11 como saida de informação
pinMode(rele3, OUTPUT); //define o pino 12 como saida de informação
pinMode(rele4, OUTPUT); //define o pino 13 como saida de informação
mx.begin();
mx.control(MD_MAX72XX::INTENSITY, MAX_INTENSITY / 4);
Serial.begin(9600);
}
void loop() {
while (Serial.available()){
sinal = Serial.read(); //define o mesmo valor que chega do modulo bluetooth para a variavel sinal
state = sinal; //define o mesmo valor para a varivel state
if (state == '0') {
velocidade = 0; //configura a velocidade com 0
}
else if (state == '1') {
velocidade = 25; //configura a velocidade com 25
}
else if (state == '2') {
velocidade = 50; //configura a velocidade com 50
}
else if (state == '3') {
velocidade = 75; //configura a velocidade com 75
}
else if (state == '4') {
velocidade = 100; //configura a velocidade com 100
}
else if (state == '5') {
velocidade = 125; //configura a velocidade com 125
}
else if (state == '6') {
velocidade = 150; //configura a velocidade com 150
}
else if (state == '7') {
velocidade = 180; //configura a velocidade com 180
}
else if (state == '8') {
velocidade = 200; //configura a velocidade com 200
}
else if (state == '9') {
velocidade = 230; //configura a velocidade com 230
}
else if (state == 'q') {
velocidade = 255; //configura a velocidade com 255
}
else if (sinal == 'F'){
frente(); //configura o robô para ir para frente
}
else if (sinal == 'B'){
tras(); //configura o robô para ir para tras
}
else if (sinal == 'L'){
esquerda(); //configura o robô para ir para esquerda
}
else if (sinal == 'R'){
direita(); //configura o robô para ir para direita
}
else if (sinal == 'U'){
liga_rele1(); //configura o rele para ligar
}
else if (sinal == 'u'){
desli_rele1(); //configura o rele para deligar
}
else if (sinal == 'X'){
liga_rele2(); //configura o rele para deligar
}
else if (sinal == 'x'){
desli_rele2(); //configura o rele para deligar
}
else if (sinal == 'W'){
liga_rele3(); //configura o rele para deligar
}
else if (sinal == 'w'){
desli_rele3(); //configura o rele para deligar
}
else if (sinal == 'V'){
liga_rele4(); //configura o rele para deligar
}
else if (sinal == 'v'){
desli_rele4(); //configura o rele para deligar
}else {
analogWrite(IN1, 0); //se nenhuma das condições for aceita então ele executa essa
analogWrite(IN2, 0);
analogWrite(IN3, 0);
analogWrite(IN4, 0);
}
Serial.println(sinal);
}
}
void tras(){
analogWrite(IN1, 0);
analogWrite(IN2, velocidade); //configura o motor A para ir para tras com a velocidade controlada
analogWrite(IN3, 0);
analogWrite(IN4, velocidade); //configura o motor B para ir para tras com a velocidade controlada
printText(0, MAX_DEVICES - 1, "CORRE!! ");
newMessageAvailable = false;
}
void frente(){
analogWrite(IN1, velocidade);//configura o motor A para ir para frente com a velocidade controlada
analogWrite(IN2, 0);
analogWrite(IN3, velocidade); //configura o motor B para ir para frente com a velocidade controlada
analogWrite(IN4, 0);
printText(0, MAX_DEVICES - 1, "esmaga");
newMessageAvailable = false;
}
void direita(){
analogWrite(IN1, 0);
analogWrite(IN2, velocidade); //configura o motor A para ir para tras com a velocidade controlada
analogWrite(IN3, velocidade); //configura o motor B para ir para frente com a velocidade controlada
analogWrite(IN4, 0);
printText(0, MAX_DEVICES - 1, ">>>>>>>>");
newMessageAvailable = false;
}
void esquerda(){
analogWrite(IN1, velocidade); //configura o motor A para ir para frente com a velocidade controlada
analogWrite(IN2, 0);
analogWrite(IN3, 0);
analogWrite(IN4, velocidade); //configura o motor B para ir para tras com a velocidade controlada
printText(0, MAX_DEVICES - 1, "<<<<<<<<");
newMessageAvailable = false;
}
void liga_rele1(){
digitalWrite(rele1, HIGH); //manda o rele ser ligado
}
void desli_rele1(){
digitalWrite(rele1, LOW);
}
void liga_rele2(){
digitalWrite(rele2, HIGH); //manda o rele ser ligado
}
void desli_rele2(){
digitalWrite(rele2, LOW);
}
void liga_rele3(){
digitalWrite(rele3, HIGH); //manda o rele ser ligado
}
void desli_rele3(){
digitalWrite(rele3, LOW);
}
void liga_rele4(){
digitalWrite(rele4, HIGH); //manda o rele ser ligado
}
void desli_rele4(){
digitalWrite(rele4, LOW);
}
Segue programação sem display max7219 (IHM de LED)
int IN1 = 3; //define o pino 3 como IN2
int IN2 = 5; //define o pino 5 como IN2
int IN3 = 6; //define o pino 6 como IN3
int IN4 = 9; //define o pino 7 como IN4
int rele1 = 10; //define o pino 10 como rele
int rele2 = 11; //define o pino 11 como rele
int rele3 = 12; //define o pino 12 como rele
int rele4 = 13; //define o pino 13 como rele
int velocidade; //define velocidade como uma veriavel inteira
char sinal; //define sinal como uma veriavel do tipo caracter
char state; //define state como uma veriavel do tipo caracter
void setup() {
Serial.begin(9600);
pinMode(IN1, OUTPUT); //define o pino 3 como saida de informação
pinMode(IN2, OUTPUT); //define o pino 5 como saida de informação
pinMode(IN3, OUTPUT); //define o pino 6 como saida de informação
pinMode(IN4, OUTPUT); //define o pino 9 como saida de informação
pinMode(rele1, OUTPUT); //define o pino 10 como saida de informação
pinMode(rele2, OUTPUT); //define o pino 11 como saida de informação
pinMode(rele3, OUTPUT); //define o pino 12 como saida de informação
pinMode(rele4, OUTPUT); //define o pino 13 como saida de informação
}
void loop() {
while (Serial.available()){
sinal = Serial.read(); //define o mesmo valor que chega do modulo bluetooth para a variavel sinal
state = sinal; //define o mesmo valor para a varivel state
if (state == '0') {
velocidade = 0; //configura a velocidade com 0
}
else if (state == '1') {
velocidade = 25; //configura a velocidade com 25
}
else if (state == '2') {
velocidade = 50; //configura a velocidade com 50
}
else if (state == '3') {
velocidade = 75; //configura a velocidade com 75
}
else if (state == '4') {
velocidade = 100; //configura a velocidade com 100
}
else if (state == '5') {
velocidade = 125; //configura a velocidade com 125
}
else if (state == '6') {
velocidade = 150; //configura a velocidade com 150
}
else if (state == '7') {
velocidade = 180; //configura a velocidade com 180
}
else if (state == '8') {
velocidade = 200; //configura a velocidade com 200
}
else if (state == '9') {
velocidade = 230; //configura a velocidade com 230
}
else if (state == 'q') {
velocidade = 255; //configura a velocidade com 255
}
else if (sinal == 'F'){
frente(); //configura o robô para ir para frente
}
else if (sinal == 'B'){
tras(); //configura o robô para ir para tras
}
else if (sinal == 'L'){
esquerda(); //configura o robô para ir para esquerda
}
else if (sinal == 'R'){
direita(); //configura o robô para ir para direita
}
else if (sinal == 'U'){
liga_rele1(); //configura o rele para ligar
}
else if (sinal == 'u'){
desli_rele1(); //configura o rele para deligar
}
else if (sinal == 'X'){
liga_rele2(); //configura o rele para deligar
}
else if (sinal == 'x'){
desli_rele2(); //configura o rele para deligar
}
else if (sinal == 'W'){
liga_rele3(); //configura o rele para deligar
}
else if (sinal == 'w'){
desli_rele3(); //configura o rele para deligar
}
else if (sinal == 'V'){
liga_rele4(); //configura o rele para deligar
}
else if (sinal == 'v'){
desli_rele4(); //configura o rele para deligar
}else {
analogWrite(IN1, 0); //se nenhuma das condições for aceita então ele executa essa
analogWrite(IN2, 0);
analogWrite(IN3, 0);
analogWrite(IN4, 0);
}
Serial.println(sinal);
}
}
void tras(){
analogWrite(IN1, velocidade);//configura o motor A para ir para frente com a velocidade controlada
analogWrite(IN2, 0);
analogWrite(IN3, velocidade); //configura o motor B para ir para frente com a velocidade controlada
analogWrite(IN4, 0);
}
void frente(){
analogWrite(IN1, 0);
analogWrite(IN2, velocidade); //configura o motor A para ir para tras com a velocidade controlada
analogWrite(IN3, 0);
analogWrite(IN4, velocidade); //configura o motor B para ir para tras com a velocidade controlada
}
void direita(){
analogWrite(IN1, velocidade); //configura o motor A para ir para frente com a velocidade controlada
analogWrite(IN2, 0);
analogWrite(IN3, 0);
analogWrite(IN4, velocidade); //configura o motor B para ir para tras com a velocidade controlada
}
void esquerda(){
analogWrite(IN1, 0);
analogWrite(IN2, velocidade); //configura o motor A para ir para tras com a velocidade controlada
analogWrite(IN3, velocidade); //configura o motor B para ir para frente com a velocidade controlada
analogWrite(IN4, 0);
}
void liga_rele1(){
digitalWrite(rele1, HIGH); //manda o rele ser ligado
}
void desli_rele1(){
digitalWrite(rele1, LOW);
}
void liga_rele2(){
digitalWrite(rele2, HIGH); //manda o rele ser ligado
}
void desli_rele2(){
digitalWrite(rele2, LOW);
}
void liga_rele3(){
digitalWrite(rele3, HIGH); //manda o rele ser ligado
}
void desli_rele3(){
digitalWrite(rele3, LOW);
}
void liga_rele4(){
digitalWrite(rele4, HIGH); //manda o rele ser ligado
}
void desli_rele4(){
digitalWrite(rele4, LOW);
}
https://www.youtube.com/watch?v=3hZtBgF2rbg
Link do vídeo - detalhe de montagem do robô.