Enviar informação de um arduino para outro

Bom dia! Alguem poderia me ajudar? estou fazendo um projeto com stepper motor e n consegui colocar uma tela oled junto com o script de rotação do motor. então peguei um nano somente para exibição de informações, mas não consigo enviar as informações do pino A1 do uno que tem o motor para o pino A0 do nano que tem a tela...seguem os códigos:

Atualmente exibe valores aleatórios sem o fio conectado nem nada...e com o fio n mostra alteração, fica oscilando entre esses aleatórios.

Motor (em negrito o que eu alterei para tentar mandar o sinal para o outro)

// Include the Arduino Stepper Library
#include <Stepper.h>
 
// Define Constants
 
// Number of steps per output rotation
const int STEPS_PER_REV = 200;
const int SPEED_CONTROL = A0;
**const int SPEED_SEND = A1;**

// The pins used are 1,2,3,4 
// Connected to L298N Motor Driver In1, In2, In3, In4 
// Pins entered in sequence 1-2-3-4 for proper step sequencing
 
Stepper stepper_NEMA17(STEPS_PER_REV, 1, 2, 3, 4);
 
void setup() {
  // nothing to do inside the void setup
  //pinMode(SPEED_SEND, OUTPUT);
}
 
void loop() {
  // read the sensor value:
  int sensorReading = analogRead(SPEED_CONTROL);
  // map it to a range from 0 to 100:
  int motorSpeed = map(sensorReading, 0, 1023, 0, 100);
  **analogWrite(SPEED_SEND,motorSpeed);**
  // set the motor speed:
  if (motorSpeed > 0) {
    stepper_NEMA17.setSpeed(motorSpeed);
    // step 1/100 of a revolution:
    stepper_NEMA17.step(STEPS_PER_REV / 100);
  }
}

Tela

// Include the Arduino Stepper Library
//#include <Stepper.h>

#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

//const int STEPS_PER_REV = 200;
const int SPEED_CONTROL = A0;

//#define CLOCK_PIN 8
//#define DATA_PIN  9
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// Define Constants
 
void setup() {

  Serial.begin(115200);

  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64
    Serial.println(F("SSD1306 allocation failed"));
    for(;;);
  }
  delay(2000);
  display.clearDisplay();

  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 3);
  // Display static text
  display.println("Enroladora 3D Factory");
  display.display(); 

  delay(2000);

}
 
void loop() {

//controle do motor

  // read the sensor value:
  //int sensorReading = analogRead(SPEED_CONTROL);
  // map it to a range from 0 to 100:
  //int motorSpeed = map(sensorReading, 0, 1023, 0, 100);

  **int motorSpeed = analogRead(SPEED_CONTROL);**
  // set the motor speed:
  if (motorSpeed > 0) {
    //stepper_NEMA17.setSpeed(motorSpeed);
    // step 1/100 of a revolution:
    //stepper_NEMA17.step(STEPS_PER_REV / 100);

//mostrar porcentagem do motor    
  display.clearDisplay();

  display.setTextColor(SSD1306_WHITE);
  //display.drawLine(0,47,0,62, SSD1306_WHITE);
  //display.setCursor(0, 10);
  //String SpeedPercent = ((String)"Velocidade : " + motorSpeed + (String)" %");
  //display.drawRect(0, 0, 128, 16, WHITE); //amarelo
  display.drawRect(12, 0, 104, 16, WHITE); //amarelo
  //display.drawRect(0, 0, 128, 32, WHITE);
  display.drawRect(0, 17, 128, 45, WHITE); //contorno tela toda
  //display.drawRect(12, 2, 104, 13, WHITE);
  display.fillRect((128/2) - (motorSpeed/2), 2, motorSpeed, 12, WHITE);
  //display.fillRect(14, 10, motorSpeed, 10, WHITE);
  //display.setTextSize(1);               // Normal 1:1 pixel scale
  //display.setTextColor(SSD1306_WHITE);  // Draw white text
  //display.setCursor(102,20);

  //display.setCursor((128/2) - 22, 30);
  //display.setCursor(10, 45);
  //display.println((String)"DIAMETRO");

  display.setTextSize(4);
  display.setCursor(10 , 25);
  display.println((String)"0.20");

  display.setTextSize(1.5);
  display.setCursor(105 , 48);
  display.println((String)"mm");


  display.setTextSize(1.5);
  display.setTextColor(BLACK);
  //const int TXT_MIDDLE = 128/2 - strlen("Velocidade : " + motorSpeed + (String)" %")/2;
  display.setCursor(0 , 10);
  //display.println((String)"MOTOR : ");

  if (motorSpeed > 9) {
  display.setCursor((128/2) - 8, 4);
  display.println(motorSpeed + (String)"%");
  //stepper_NEMA17.setSpeed(motorSpeed);
  // step 1/100 of a revolution:
  //stepper_NEMA17.step(STEPS_PER_REV / 100);
  } else if (motorSpeed == 100) {
  display.setCursor((128/2) - 10, 4);
  display.println(motorSpeed + (String)"%");
  //stepper_NEMA17.setSpeed(motorSpeed);
  // step 1/100 of a revolution:
  //stepper_NEMA17.step(STEPS_PER_REV / 100);
  } else { 
  display.setCursor((128/2) - 4, 4);
  display.println(motorSpeed + (String)"%"); 
  //stepper_NEMA17.setSpeed(motorSpeed);
  // step 1/100 of a revolution:
  //stepper_NEMA17.step(STEPS_PER_REV / 100);
  }


  display.display(); 

//buzzer
  digitalWrite(11, HIGH);
  delay(1000);
  digitalWrite(11, LOW);
  }
}

Desde já, obrigado!

E porque não, cometeria um erro na escolha dos pinos e na sua declaração. Não vejo necessidade de dois arduinos para isso. Carregue o link para os motores e o ecrã e os códigos antigos.

1 Like

Obrigado pelo seu retorno amigo! ele estava basicamente assim:

// Include the Arduino Stepper Library
#include <Stepper.h>

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
 
// Define Constants
 
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// Number of steps per output rotation
const int STEPS_PER_REV = 200;
const int SPEED_CONTROL = A0;

// The pins used are 1,2,3,4 
// Connected to L298N Motor Driver In1, In2, In3, In4 
// Pins entered in sequence 1-2-3-4 for proper step sequencing
 
Stepper stepper_NEMA17(STEPS_PER_REV, 1, 2, 3, 4);
 
void setup() {

  Serial.begin(9600);

  // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally
  if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
    Serial.println(F("SSD1306 allocation failed"));
    for(;;); // Don't proceed, loop forever
  }
}
 
void loop() {
  // read the sensor value:
  int sensorReading = analogRead(SPEED_CONTROL);
  // map it to a range from 0 to 100:
  int motorSpeed = map(sensorReading, 0, 1023, 0, 100);
  // set the motor speed:
  if (motorSpeed > 0) {
    stepper_NEMA17.setSpeed(motorSpeed);
    // step 1/100 of a revolution:
    stepper_NEMA17.step(STEPS_PER_REV / 100);
  }

  //mostrar porcentagem do motor    
  //display.clearDisplay();
  display.setTextSize(1.5);
  display.setTextColor(WHITE);
  //const int TXT_MIDDLE = 128/2 - strlen("Velocidade : " + motorSpeed + (String)" %")/2;
  display.setCursor(0 , 10);
  //display.println((String)"MOTOR : ");

  if (motorSpeed > 9) {
  display.setCursor((128/2) - 8, 2);
  display.println(motorSpeed + (String)"%");
  } else if (motorSpeed == 100) {
  display.setCursor((128/2) - 10, 2);
  display.println(motorSpeed + (String)"%");
  } else { 
  display.setCursor((128/2) - 4, 2);
  display.println(motorSpeed + (String)"%"); 
  }
}

Dessa maneira a barra de porcentagem da velocidade do motor estava ok! Mas o Stepper motor não inicia! só dá pequenos solavancos e trepidações....Havia lido alguns fóruns sobre esse problema e parece que o motor precisa de pulsos constantes e colocar atualização de tela ou variaveis atrapalha isso...não sei se procede ou faz sentido para seu conhecimento...

Não tenho um mena17 para testar o motor, mas tenho uma tela OLED.
Tentei com um 28BYJ-48 + ULN2003 + oled e funciona bem, embora o código seja diferente para um mena17.
O código que tem no mega para o motor funciona corretamente?
Caso contrário, carregue um diagrama de fiação.

1 Like

Eu estou usando um L298N então os pinos PWM do UNO (1,2,3,4) estão indo para IN1,IN2,IN3,IN4 da ponte, na mesma ordem...Como disse, assim que coloco as atualizações de tela no loop, o motor começa a falhar...

O controle de velocidade é feito por um potenciometro 10k que manda o sinal para A0.

Não foi isso. Deduzi essa montagem do código.
Eu queria saber se com este código:

// Include the Arduino Stepper Library
#include <Stepper.h>
 
// Define Constants
 
// Number of steps per output rotation
const int STEPS_PER_REV = 200;
const int SPEED_CONTROL = A0;
**const int SPEED_SEND = A1;**

// The pins used are 1,2,3,4 
// Connected to L298N Motor Driver In1, In2, In3, In4 
// Pins entered in sequence 1-2-3-4 for proper step sequencing
 
Stepper stepper_NEMA17(STEPS_PER_REV, 1, 2, 3, 4);
 
void setup() {
  // nothing to do inside the void setup
  //pinMode(SPEED_SEND, OUTPUT);
}
 
void loop() {
  // read the sensor value:
  int sensorReading = analogRead(SPEED_CONTROL);
  // map it to a range from 0 to 100:
  int motorSpeed = map(sensorReading, 0, 1023, 0, 100);
  **analogWrite(SPEED_SEND,motorSpeed);**
  // set the motor speed:
  if (motorSpeed > 0) {
    stepper_NEMA17.setSpeed(motorSpeed);
    // step 1/100 of a revolution:
    stepper_NEMA17.step(STEPS_PER_REV / 100);
  }
}

Instalado no arduino mega o motor funciona bem.
E eu te pergunto porque:

  • Você está usando o pino 1 usado para comunicação com o PC, que embora você não faça nada pode interferir em alguma coisa. Eu mudaria para outros pinos 2, 3, 4 e 5 por exemplo

  • Entendo que para essa conexão, para a biblioteca "Stepper.h" você tem que declará-la com os pinos invertidos, ou seja:

Stepper stepper_NEMA17(STEPS_PER_REV, 4, 3, 2, 1);

Experimente antes de mexer na tela.

PS: Presumo que você alimente o L298N com 12V.

1 Like

Isso! Ele roda normalmente! Só trava quando insiro as informações de tela, como porcentagem da potência! Pode me esclarecer a questão de inversão? pq ele funciona normalmente!

Quanto a questão do pino 1, verdade fiz conforme o passo a passo e não vi que o 1 era TX...Se for deixar de usar ele seria 5,4,3,2? vou testar!

Hello Again! Changing the script to 5,4,3,2 just changed the rotation! I need It anti clockwise, so I need to keep 2,3,4,5....I'll try to add screen scripts!

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.