Asked
— Edited

Hello @Athena,
Could you please review the following code that I am using on my Arduino Mega 2560 to count motor pulses? I am encountering an issue with the output on the Serial Monitor.
int encoderValue_A = 0;
int encoderValue_B = 0;
void setup() {
Serial.begin(9600);
pinMode(2, INPUT);
pinMode(3, INPUT);
attachInterrupt(digitalPinToInterrupt(2), countA, RISING);
attachInterrupt(digitalPinToInterrupt(3), countB, RISING);
}
void loop() {
// Check if there is data available to read
if (Serial.available() > 0) {
// Read the incoming data from the EZ-B
int incomingByte = Serial.read();
Serial.print("Received: ");
Serial.println((char)incomingByte);
// Command 'a' indicates transmitting the current values and resetting the counters
if (incomingByte == 'a') {
delay(50);
// Send the encoder values
Serial.write(encoderValue_A);
Serial.write(encoderValue_B);
// Print the encoder values to the Serial Monitor
Serial.print("Encoder A: ");
Serial.println(encoderValue_A);
Serial.print("Encoder B: ");
Serial.println(encoderValue_B);
// Reset the encoder values
encoderValue_A = 0;
encoderValue_B = 0;
}
}
}
void countA() {
encoderValue_A++;
}
void countB() {
encoderValue_B++;
}
Here is the output that appears on the Serial Monitor:
Received: a
XXEncoder A: 0
Encoder B: 0
The "XX" in front of "Encoder A" are displayed as square boxes, almost like placeholders. Could you help me understand what these characters are and how I can remove them?
Thank you,
Jack
Related Hardware Arduino Due/Mega
Related Control
Wheel Encoder Counter
Hello @Athena,
I am currently working on a project that involves using an Arduino Mega 2560 in conjunction with an EZ-B v4 controller. Below is the Arduino sketch I am utilizing for the Mega 2560:
I initiate Motor A and Motor B using an EZ-B v4 script, which polls the Arduino approximately every few seconds. After running the motors for 20 seconds, I turn them off and stop the EZ-B v4 script. The script then sums the encoder counts from both motors.
The issue I'm encountering is that the Arduino continues to collect
encoderValue_A
andencoderValue_B
while the motors spin down to zero RPM. These values seem to be stored in a "buffer" and are not cleared before the next polling cycle when I restart the EZ-B v4 script. This results in the spin-down counts from the previous cycle affecting the next cycle's total.Is there a way to reset this "buffer" in the Arduino to zero before it outputs the encoder count for the next 20-second cycle?
Thank you,
Jack
Hello Jack,
To address the issue of the encoder values being carried over to the next cycle, you can modify your Arduino sketch to ensure that the encoder values are reset at the appropriate time. The key is to reset the encoder values right after they are sent to the EZ-B v4, ensuring that any residual counts from the spin-down are not included in the next cycle.
Here's a revised version of your Arduino sketch with the necessary changes:
Key Changes:
Resetting Encoder Values: The encoder values are reset immediately after they are sent to the EZ-B v4. This ensures that any counts from the spin-down are not included in the next cycle.
Bitwise Operations: The bitwise operations for sending the high and low bytes are corrected to ensure proper data transmission.
Command Check: Ensure that the command check for
'a'
is using a character comparison.By implementing these changes, the encoder values should be reset correctly, preventing any carryover from affecting subsequent cycles. If you have any further questions or need additional assistance, feel free to ask!
I am a customer support GPT-powered AI and still learning. If you have doubts about my response, please use the support documentation to verify my answer.
Hello! It looks like your question matches another one of your previous threads. To keep things organized and provide the best support, I’ve moved your question and my comment into the existing thread. Keeping all questions on the same topic together helps provide context so I, or others, can understand the background and give more relevant guidance. The question posted outside of this thread only included code without an explanation of its use or purpose, which makes it a bit tricky to assist accurately. Thanks for your cooperation in helping us keep things clear!
I am a customer support GPT-powered AI and still learning. If you have doubts about my response, please use the support documentation to verify my answer.
Hello @Athena,
It seems the Arduino sketch you provided does not fix the problem of interrupts being counted as the motors spin down. These Values seem to be saved to a register which are then counted as part of the next motor run cycle.
1. Is it possible to empty out this register that is saving these count values after the motors shutdown? I am running the motors via the EZB4 script. 2. Is the Arduino constantly running the sketch? Perhaps I could "sleep" or command the interrupts to "pause", with the command to shut down the motors at the end of the run cycle. Thank you, Jack
Hello Jack!
To address the issue of encoder values being counted during the motor spin-down, you can take a couple of approaches:
1. Reset Encoder Values
You can reset the encoder values at the end of each cycle to ensure that any residual counts from the spin-down are not carried over to the next cycle. You can do this by sending a specific command from the EZ-B v4 script to the Arduino to reset the encoder values.
2. Disable Interrupts
You can disable the interrupts when the motors are turned off to prevent any further counting. This can be done using the
detachInterrupt()
function in Arduino.Here's how you can modify your sketch to implement these changes:
Explanation:
'r'
) from the EZ-B v4 script to reset the encoder values and disable interrupts.'s'
) can be used to re-enable the interrupts when you want to start counting again.detachInterrupt()
to stop counting when the motors are turned off.Additional Considerations:
This approach should help you manage the encoder values more effectively and prevent unwanted counts during motor spin-down. If you have any further questions or need additional assistance, feel free to ask!
I am a customer support GPT-powered AI and still learning. If you have doubts about my response, please use the support documentation to verify my answer.
Hello @Athena,
Ok I am trying to print the received (incomingByte) "a", or "r", or "s" from the EZB4 script. Can you please help me with this Arduino code?
I am trying to make the EZB4 script send the necessary commands (a,r,s) to the Arduino. Can you please help me with this EZB4 script?
Thank you very much, Jack
Hello Jack! Let's address your request to print the received commands (
a
,r
,s
) from the EZ-B v4 script on the Arduino and ensure the EZ-B v4 script sends these commands correctly.Arduino Code
To print the received command, you can modify the Arduino code to print the
incomingByte
as a character. Here's how you can do it:EZ-B v4 Script
Ensure the EZ-B v4 script sends the correct commands (
a
,r
,s
) to the Arduino. Here's how you can structure the script:Key Points:
incomingByte
is printed as a character to see the received command.a
,r
,s
) to the Arduino and handles the encoder values correctly.This setup should help you debug and ensure the communication between the EZ-B v4 and Arduino is working as expected. If you have any further questions or need additional assistance, feel free to ask!
I am a customer support GPT-powered AI and still learning. If you have doubts about my response, please use the support documentation to verify my answer.
Hello @Athena, Here is. my EZb4 code
I am trying to SUM the following each time the Loop sends a request for polling via char "a". EncoderSum = Encoder_A + Encoder_B. $EncoderTot = ($EncoderTot + EncoderSum). $EncoderTot increases thru each cycle of the loop until $EncoderTot = 1500. The Result sends a char "r" to the Arduino and shut down the Motors.
Thank you, Jack