Hi,
I have questions regarding a couple scenarios I tried. I am currently using a touch screen shield from Adafruit that's mounted in my Arduino Uno (1). I connected it with I2C to another Arduino Uno (2). I want a "button" on the touch screen that will to stop all motors at any time. For example, when the button is touched, STOP==1.
- I tried using a while loop right under void loop(), but it runs through the whole void loop before checking the while condition again.
void loop(){
while (!STOP==1){
//run motors
}
}
- Since the ISR acts like an interrupt, I added a function that executes when STOP==1. Currently, the function just prints "EMERGENCY STOPPING". Nothing printed when ran.
#include <NewPing.h>
#include <Wire.h>
#define D1 11 //for LA
#define Stop 7 //for LA
#define D3 12 //for LA
#define TRIGGER_PIN 4 // for trigger ultrasonic sensor.
#define ECHO_PIN 6 // for echo ultrasonic sensor..
#define MAX_DISTANCE 30 // for ultrasonic sensor.
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
volatile int uSonar = 0;
volatile int pipeSSelection = 5;
volatile int STOP = 0;
void setup() {
pinMode(D1, OUTPUT);
pinMode(Stop, OUTPUT);
pinMode(D3, OUTPUT);
pinMode(4, INPUT);
pinMode(5, INPUT);
pinMode(6, INPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
digitalWrite(8, HIGH);//wheel stops
digitalWrite(Stop, HIGH); //STOP on LA
// put your setup code here, to run once:
Wire.begin(4); // join i2c bus with address #4
Wire.onReceive(receiveEvent);
Serial.begin(9600);
}
void loop() {
exitLA(10);
unsigned int uS = sonar.ping();
uS = uS / US_ROUNDTRIP_CM;
uSonar = 0;
while (uS < 17) {
uSonar = 1;
break;
}
Serial.print("uSonar: ");
Serial.print(uSonar);
Serial.print("\n");
Serial.print("pipeSelection: ");
Serial.print(pipeSSelection);
Serial.print("\n");
if ((pipeSSelection == 1) && (uSonar == 1)) { //reading ultrasonic sensor
digitalWrite(8, LOW); //Spins the wheel
delay(500);
Serial.print("Wheels spun");
Serial.print("\n");
enterLA(13); //Linear actuator Enters
delay(10000);
digitalWrite(Stop, HIGH); //stops LA
Serial.print("LA entered and stopped");
Serial.print("\n");
while (digitalRead(5) == LOW) { //reading the limit switch
Serial.print("waiting for LS");
Serial.print("\n");
}
if (digitalRead(5) == HIGH) { //Limit swith detects pipe
Serial.print("LS detects pipe");
Serial.print("\n");
delay(2000); //turns the pipe 200 deg
Serial.print("pipe spun 200 degrees");
Serial.print("\n");
digitalWrite(8, HIGH); //Stops wheel
Serial.print("Wheel stopped");
Serial.print("\n");
digitalWrite(9, HIGH); //FANUC_1 DI=ON
Serial.print("FANUC DI_1 is ON!!!");
Serial.print("\n");
delay(500);
digitalWrite(9, LOW); //FANUC_1 DI=OFF
Serial.print("FANUC DI_1 turned OFF");
Serial.print("\n");
digitalWrite(8, LOW); //starts wheel
delay(2500); //turns pipe 180
Serial.print("Wheels spun 180");
Serial.print("\n");
digitalWrite(8, HIGH); //stops wheel
Serial.print("Wheels stopped");
Serial.print("\n");
digitalWrite(9, HIGH); //FANUC_1 DI=ON
Serial.print("FANUC DI_1 is ON!!!");
Serial.print("\n");
delay(1000);
digitalWrite(9, LOW); //FANUC_1 DI=OFF
Serial.print("FANUC DI_1 turned OFF");
Serial.print("\n");
exitLA(15);
exit;
}
}
else if (pipeSSelection == 2) {
if (uSonar == 1) {
//ultrasonic sensor detects pipe
digitalWrite(8, HIGH); //Spins the wheel
//LA movement
digitalWrite(Stop, LOW);
digitalWrite(D1, LOW);
digitalWrite(D3, LOW); //Linear actuator Enters
delay(13000);
digitalWrite(Stop, HIGH);
//Linear actuator positions the pipe
while (digitalRead(5) == LOW) { //reading the limit switch
return;
}
if (digitalRead(5) == HIGH) { //Limit swith detects pipe
delay(2000); //turns the pipe 200 deg
digitalRead(5) == LOW; //Stops wheel
digitalWrite(10, HIGH); //FANUC_2 DI=ON
delay(50);
digitalWrite(10, LOW); //FANUC_2 DI=OFF
digitalWrite(8, HIGH); //starts wheel
delay(2500); //turns pipe 180
digitalWrite(8, LOW); //stops wheel
digitalWrite(10, HIGH); //FANUC_2 DI=ON
delay(50);
digitalWrite(10, LOW); //FANUC_2 DI=OFF
exit;
}
}
}
}
void EmergencyStop() {
Serial.print("EMERGENCY STOPPING");
Serial.print("EMERGENCY STOPPING");
Serial.print("EMERGENCY STOPPING");
Serial.print("EMERGENCY STOPPING");
Serial.print("EMERGENCY STOPPING");
Serial.print("EMERGENCY STOPPING");
Serial.print("EMERGENCY STOPPING");
Serial.print("EMERGENCY STOPPING");
}
void receiveEvent(int howMany) {
byte Slave[2];
int index = 0;
while (Wire.available() && index < 2) {
Slave[index] = Wire.read();
index++;
}
pipeSSelection = Slave[0];
STOP = Slave[1];
if (STOP == 8) {
EmergencyStop();
}
}
void enterLA (int enterTime) {
int x = 0;
digitalWrite(Stop, LOW);
while (x < enterTime) {
digitalWrite(D1, LOW);
digitalWrite(D3, LOW);
x++;
}
return;
}
void exitLA (int exitTime) {
digitalWrite(Stop, LOW);
for (int x = 0; x < exitTime; x++) {
digitalWrite(D1, HIGH);
digitalWrite(D3, HIGH);
}
return;
}
void stay (int stayTime) {
for (int x = 0; x < stayTime; x++) {
digitalWrite(Stop, HIGH);
digitalWrite(D1, HIGH);
digitalWrite(D3, LOW);
}
return;
}
- If I'm able to get have digitalOutput from the touch screen, currently asking the manufacturer, could I use an attachInterrupt? It wouldn't be a continuous wave.