Hi,
I want to grab data from this Ultrasonic Ranger and from this encoder. and sent the data trough serial to MAX MSP. I got both of them working separately but I am running in to issues when I try to grab both inputs.
I think the encoder is not registering the right direction and or is skipping steps.
I tried messing around with this library that is supposed to allow for coroutines but I couldn’t even get the examples to work properly.
Here is the code I have at the moment (without the coroutine stuff):
unsigned long echo = 0;
int ultraSoundSignal = 7;
int tempValue = 0;
int sensorValue0 = 0;
int sensorValue1 = 0;
int n = LOW;
int encoderA = 3;
int encoderB = 4;
int encoderPos = 0;
int encoderALast = LOW;
void setup() {
Serial.begin(38400);
pinMode (ultraSoundSignal, OUTPUT);
pinMode (encoderA, INPUT);
pinMode (encoderB, INPUT);
}
void loop() {
encode ();
tempValue = ping ();
// Keeps Ultrasonic data withing range
if (tempValue < 8000) {
if (tempValue < 0) {
tempValue = 9999;
}
sensorValue0 = tempValue;
}
sensorValue1 = encoderPos;
Serial.print(sensorValue0);
Serial.print(" ");
Serial.print(sensorValue1);
Serial.print("\n");
}
//Grabs data from ultrasonic ranger V1.0
unsigned long ping () {
pinMode (ultraSoundSignal, OUTPUT);
digitalWrite (ultraSoundSignal, LOW);
digitalWrite (ultraSoundSignal, HIGH);
digitalWrite (ultraSoundSignal, LOW);
pinMode (ultraSoundSignal, INPUT);
digitalWrite (ultraSoundSignal, HIGH);
echo = pulseIn(ultraSoundSignal, HIGH);
return echo;
}
//Grabs data from rotary encoder
void encode () {
n = digitalRead(encoderA);
if ((encoderALast == LOW) && (n == HIGH)) {
if (digitalRead (encoderB) == HIGH) {
encoderPos--;
if (encoderPos < 0) {
encoderPos = 1000;
}
} else {
encoderPos++;
if (encoderPos > 1000) {
encoderPos = 0;
}
}
}
encoderALast = n;
}
The encoder gives strange values back, but if you comment out the line with tempValue = ping ();
it works fine. The Ultrasonic Ranger seems to be working fine either way.
Can anybody point me in the right direction of doing this sort of thing?