Hola compañeros. Estoy realizando un proyecto de arduino mega con un motor drive. Tengo varios ¨Void¨ que funcionan con el serial. Pero requiero tener activo dos en especial, en otras palabras que cuando le de el comando de activarse, queden activos hasta que se cambie de configuracion.
Los comandos son el ¨single¨ and ¨slug¨. Adjunto codigo para que sea entendible
#include <Wire.h>
#include <LiquidCrystal.h>
#include <TimerOne.h>
#include "CytronMotorDriver.h"
char user_input;
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// CONSTANT MOVEMENT SENSORS
int calibrationTime = 30;
long unsigned int lowIn;
long unsigned int pause = 1000;
boolean lockLow = true;
boolean takeLowTime;
int count = 0;
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// MOVEMENT SENSOR
const int pirPin = 2; // Movement Sensor 1
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// INT MOVEMENT SENSORS
int pirPushCounter = 0;
int pirState = 0;
int lastPirState = 0;
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// TIME
volatile long int Time = 0;
volatile long int Time1 = 0;
volatile long int Time2 = 0;
volatile long int Time3 = 0;
volatile long int Time4 = 0;
volatile long int Time5 = 0;
volatile long int Time6 = 0;
volatile long int Time7 = 0;
volatile long int Time8 = 0;
volatile long int Time9 = 0;
volatile long int Time10 = 0;
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//MOTOR PARAMETERS
CytronMD motor1(PWM_DIR, 13, 12);
CytronMD motor2(PWM_DIR, 11, 10);
CytronMD motor3(PWM_DIR, 9, 8);
CytronMD motor4(PWM_DIR, 7, 6);
CytronMD motor5(PWM_DIR, 5, 4);
#define matrix ;
short usSpeed = 255;
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
void setup() {
{
Serial.begin(9600);
//---------------------------------------------------------//
//PIN MOVEMENT SENSORS
pinMode(pirPin, INPUT);
//---------------------------------------------------------//
digitalWrite(pirPin, LOW);
//---------------------------------------------------------//
//START CALIBRATION OF SENSORS
Serial.print("Calibrating Sensor ");
for (int i = 0; i < calibrationTime; i++) {
Serial.print(".");
delay(1000);
}
Serial.println(" Done");
Serial.println("SENSOR ACTIVE");
delay(10);
//---------------------------------------------------------//
}
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//MOTORS PARAMETERS
}
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
void Timer(void) {
Time++;
}
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
void loop() {
while (Serial.available()) {
user_input = Serial.read();
if (user_input == '1') {
Stop();
} else if (user_input == '2') {
Forward();
} else if (user_input == '3') {
Reverse();
} else if (user_input == '+') {
IncreaseSpeed();
} else if (user_input == '-') {
DecreaseSpeed();
} else if (user_input == 'r') {
Zero();
} else if (user_input == 'a') {
Slug();
} else if (user_input == 's') {
Single();
}
}
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// MOVEMENT SENSOR 1
pirState = digitalRead(pirPin);
if(pirState == HIGH){
if(lockLow){
lockLow = false;
pirPushCounter++;
count++;
Serial.print("Number of counts: ");
Serial.println(pirPushCounter);
delay(5);
}
takeLowTime = true;
}
/*{
Serial.print("idcont.val=");
Serial.print(pirPushCounter);
Serial.write(0xff);
Serial.write(0xff);
Serial.write(0xff);
} */
if(pirState == LOW){
if(takeLowTime){
lowIn = millis();
takeLowTime = false;
}
if(!lockLow && millis() - lowIn > pause){
lockLow = true;
}
}
if (count == 0);{
Time1++;
delay(1000);
Serial.println(Time1);
} if (Time1 >= 20){
Time1 = 0;
}
}
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
void Slug() {
Serial.println("SLUG");
if (count > 0) {
Serial.print("Accumulate Count: ");
Serial.println(count);
} if (count >= 5) {
count = 0;
}
if (count == 1){
motor1.setSpeed(0);
} else if (count == 2){
motor2.setSpeed(0);
} else if (count == 3){
motor3.setSpeed(0);
} else if (count == 4){
motor4.setSpeed(0);
} else if (count == 5){
motor5.setSpeed(0);
}
if (Time1 >= 20){
motor1.setSpeed(255);
motor2.setSpeed(255);
motor3.setSpeed(255);
motor4.setSpeed(255);
motor5.setSpeed(255);
Serial.println("ON");
Time1 = 0;
}
}
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
void Single() {
Serial.println("SINGLE");
if (count > 0) {
Serial.print("Sequential Count: ");
Serial.println(count);
} if (count >= 5) {
count = 0;
}
if (count == 1){
motor1.setSpeed(0);
} if (count == 2){
motor2.setSpeed(0);
} if (count == 3){
motor3.setSpeed(0);
} if (count == 4){
motor4.setSpeed(0);
} if (count == 5){
motor5.setSpeed(0);
}
Time1 = 0;
if (Time1 >= 20){
motor1.setSpeed(255);
Serial.println("1");
Time2 = 0;
if (Time2 >= 5){
motor2.setSpeed(255);
Serial.println("2");
} Time3 = 0;
if (Time3 >= 5){
motor3.setSpeed(255);
Serial.println("3");
} Time4 = 0;
if (Time4 >= 5){
motor4.setSpeed(255);
Serial.println("4");
} Time5 = 0;
if (Time5 >= 5){
motor5.setSpeed(255);
Serial.println("5");
}
}
}
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
void Stop() {
Serial.println("Stop");
motor1.setSpeed(0);
motor2.setSpeed(0);
motor3.setSpeed(0);
motor4.setSpeed(0);
motor5.setSpeed(0);
}
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
void Forward() {
Serial.println("Forward");
motor1.setSpeed(255);
motor2.setSpeed(255);
motor3.setSpeed(255);
motor4.setSpeed(255);
motor5.setSpeed(255);
}
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
void Reverse() {
Serial.println("Reverse");
motor1.setSpeed(-255);
motor2.setSpeed(-255);
motor3.setSpeed(-255);
motor4.setSpeed(-255);
motor5.setSpeed(-255);
}
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
void IncreaseSpeed() {
usSpeed = usSpeed + 10;
if (usSpeed > 255) {
usSpeed = 255;
}
Serial.print("Speed +: ");
Serial.println(usSpeed);
motor1.setSpeed(usSpeed);
motor2.setSpeed(usSpeed);
motor3.setSpeed(usSpeed);
motor4.setSpeed(usSpeed);
motor5.setSpeed(usSpeed);
}
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
void DecreaseSpeed() {
usSpeed = usSpeed - 10;
if (usSpeed < 0) {
usSpeed = 0;
}
Serial.print("Speed -: ");
Serial.println(usSpeed);
motor1.setSpeed(usSpeed);
motor2.setSpeed(usSpeed);
motor3.setSpeed(usSpeed);
motor4.setSpeed(usSpeed);
motor5.setSpeed(usSpeed);
}
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
void Zero() {
pirPushCounter=0;
Serial.print("idcont.val=");
Serial.print(pirPushCounter);
Serial.write(0xff);
Serial.write(0xff);
Serial.write(0xff);
user_input = 'x';
}
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Hola amigo, me puedes ense;ar un ejemplo, si entendi, pero ocupo ver. Si porque ocupo que el usuario introduzca la opcion, pero que sea infinito hasta que el usuario escoja otra opcion
Hola, si tal vez no me explique mejor. Lo que requiero es que el void single y slug hagan un un bucle infinito al ser seleccionados. Y que se apague ese bucle hasta que el usuario lo diga.
Hola amigo, muchas gracias por tu ayuda, pero no. No me funciona, requiero que el void quede encendido sin ningun corte, tengo que estar introduciendo el valor en serial port para que me lea el void, intente con otro metodo que es SWITCH y tampoco me funciona. Adjunto codigo:
#include <Wire.h>
#include <LiquidCrystal.h>
#include <TimerOne.h>
#include "CytronMotorDriver.h"
char user_input;
//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// Direction of Arduino Slave
const int slaveAddress = 9;
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// MOVEMENT SENSOR
#define movement_pin1 2
bool item_detected = false;
int item_counter = 0;
int count = 0;
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
// TIME
volatile long int Time = 0;
volatile long int Time1 = 0;
volatile long int Time2 = 0;
volatile long int Time3 = 0;
volatile long int Time4 = 0;
volatile long int Time5 = 0;
volatile long int Time6 = 0;
volatile long int Time7 = 0;
volatile long int Time8 = 0;
volatile long int Time9 = 0;
volatile long int Time10 = 0;
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
//MOTOR PARAMETERS
CytronMD motor1(PWM_DIR, 13, 12);
CytronMD motor2(PWM_DIR, 11, 10);
CytronMD motor3(PWM_DIR, 9, 8);
CytronMD motor4(PWM_DIR, 7, 6);
CytronMD motor5(PWM_DIR, 5, 4);
short usSpeed = 200;
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
void setup() {
{
Serial.begin(9600);
Wire.begin();
//---------------------------------------------------------//
//PIN MOVEMENT SENSORS
pinMode(movement_pin1 , INPUT);
//---------------------------------------------------------//
}
}
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
void Timer(void) {
Time++;
}
//---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
void loop() {
// MOVEMENT SENSOR 1
{
int val = digitalRead(movement_pin1);
if( (item_detected == false) && ( val == 0 )){
item_detected = true;
item_counter++;
count++;
Serial.print("Boxes: ");
Serial.println(item_counter);
// Serial.print("idcont.val=");
// Serial.print(item_counter);
// Serial.write(0xff);
// Serial.write(0xff);
// Serial.write(0xff);
} else if( (item_detected == true) && ( val == 1 )){
item_detected = false;
}
}
if (Serial.available()){
user_input = Serial.read();
switch (user_input) {
case '1':
Serial.println("Stop");
motor1.setSpeed(0);
motor2.setSpeed(0);
motor3.setSpeed(0);
motor4.setSpeed(0);
motor5.setSpeed(0);
break;
case '2':
Serial.println("Forward");
motor1.setSpeed(255);
motor2.setSpeed(255);
motor3.setSpeed(255);
motor4.setSpeed(255);
motor5.setSpeed(255);
break;
case '3':
Serial.println("Reverse");
motor1.setSpeed(-255);
motor2.setSpeed(-255);
motor3.setSpeed(-255);
motor4.setSpeed(-255);
motor5.setSpeed(-255);
break;
case '+':
{
usSpeed = usSpeed + 10;
if (usSpeed > 255) {
usSpeed = 255;
}
Serial.print("Speed +: ");
Serial.println(usSpeed);
motor1.setSpeed(usSpeed);
motor2.setSpeed(usSpeed);
motor3.setSpeed(usSpeed);
motor4.setSpeed(usSpeed);
motor5.setSpeed(usSpeed);
break;
}
case '-':
{
usSpeed = usSpeed - 10;
if (usSpeed < 0) {
usSpeed = 0;
}
Serial.print("Speed -: ");
Serial.println(usSpeed);
motor1.setSpeed(usSpeed);
motor2.setSpeed(usSpeed);
motor3.setSpeed(usSpeed);
motor4.setSpeed(usSpeed);
motor5.setSpeed(usSpeed);
break;
}
case '6':
{
item_counter = 0;
Serial.print("idcont.val=");
Serial.print(item_counter);
Serial.write(0xff);
Serial.write(0xff);
Serial.write(0xff);
user_input = 'x';
break;
}
case '7':
{
Serial.println("Slug");
Serial.print("Slug Counter: ");
Serial.println(count);
if (count == 0){
} else if (count == 1){
motor1.setSpeed(0);
Time = 0;
} else if (count == 2){
motor2.setSpeed(0);
Time = 0;
} else if (count == 3){
motor3.setSpeed(0);
Time = 0;
} else if (count == 4){
motor4.setSpeed(0);
Time = 0;
} else if (count == 5){
motor5.setSpeed(0);
Time = 0;
}
if (Time >= 20){
motor1.setSpeed(255);
motor2.setSpeed(255);
motor3.setSpeed(255);
motor4.setSpeed(255);
motor5.setSpeed(255);
Time1 = 0;
}
}
break;
case '8':
{
Serial.println("Single");
\
if (count > 0) {
Serial.print("Single Count: ");
Serial.println(count);
}
if (count == 1){
motor1.setSpeed(0);
}
if (count == 2){
motor2.setSpeed(0);
}
if (count == 3){
motor3.setSpeed(0);
}
if (count == 4){
motor4.setSpeed(0);
}
if (count == 5){
motor5.setSpeed(0);
Time1++;
}
if (Time1 < 20) {
motor1.setSpeed(255);
Serial.println("1");
delay(500);
} if (Time2 < 5) {
motor2.setSpeed(255);
Serial.println("2");
delay(500);
Time3 = 0;
} if (Time3 < 5) {
motor3.setSpeed(255);
Serial.println("3");
delay(500);
Time4 = 0;
} if (Time4 < 5) {
motor4.setSpeed(255);
Serial.println("4");
delay(500);
Time5 = 0;
} if (Time5 < 5) {
motor5.setSpeed(255);
Serial.println("5");
delay(500);
}
break;
}
}
}
}
//--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------