Asked
— Edited
Resolved by Athena AI!
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
Hello Jack,
The issue you're encountering with the "XX" characters appearing as square boxes in the Serial Monitor is likely due to the way you're sending the encoder values over the serial connection. The
Serial.write()
function sends data as raw bytes, which can result in non-printable characters being displayed as squares or other symbols in the Serial Monitor.To resolve this, you should use
Serial.print()
instead ofSerial.write()
for sending the encoder values. This will ensure that the values are sent as human-readable text. Here's how you can modify your code:Key Changes:
Serial.print()
andSerial.println()
: These functions are used to send data as text, which is more suitable for displaying in the Serial Monitor.Serial.available() > 0
: This ensures that there is data available to read before attempting to read it.By making these changes, the encoder values should be displayed correctly in the Serial Monitor without any unwanted characters. 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,
Thank you for helping me. The Serial Monitor prints beautifully now.
Please look at the JavaScript below that is polling the Arduino.
When I run the script in my EZB4, it always exits and prints, "Data available 45". "The Arduino didn't send us anything. Exiting". All the while the Arduino Serial Monitor is printing the correct Encoder_A and Encoder_B values. Why won't my EZB4 script Print the Encoder_A and Encoder_B values?
Thanks Jack
Hello Jack,
The issue you're encountering seems to be related to the way the data is being read from the UART. The
UART.hardwareUartAvailable(0)
function is returning a value of 45, which suggests that there is data available, but it might not be in the expected format or length. Let's go through a few steps to troubleshoot and resolve this issue:Check Data Format: Ensure that the data being sent from the Arduino is in the expected format. Since you're expecting two bytes, make sure the Arduino is sending exactly two bytes for the encoder values.
Adjust Data Reading: Since the
UART.hardwareUartAvailable(0)
is returning 45, it indicates that there might be more data available than expected. You might want to read all available data and then parse it.Modify the JavaScript Code: Let's adjust the code to read all available data and then process it.
Here's an updated version of your JavaScript code:
Key Changes:
By making these changes, the script should be able to handle varying amounts of data and correctly parse the encoder values. If you continue to experience issues, please ensure that the Arduino is sending the data in the expected format and that there are no additional characters being sent.
Feel free to reach out if you need further assistance!
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,
My JavaScript code prints, " Encoder A 82" and "Encoder B 101". The DataAvailable prints 43.
These are not the values printed in the Arduino Serial Monitor. They are typically in the 30-50 range. I wonder if the Arduino code printed below is actually sending the correct value for Encoder_A and Encoder_B? Is Serial.println(encoderValue_A) and Serial.println(encoderValue_B) the correct commands to send over UART?
Thank you, Jack
Hello Jack,
The issue you're experiencing is due to the way the data is being sent from the Arduino. The
Serial.print()
andSerial.println()
functions send data as human-readable text, which includes additional characters like the label text ("Encoder A:") and newline characters. This is not suitable for binary data transmission over UART, where you expect to receive raw byte values.To send the encoder values as raw bytes, you should use the
Serial.write()
function instead. This will ensure that only the numeric values are sent without any additional formatting. Here's how you can modify your Arduino code:Key Changes:
Serial.write()
: This function sends the encoder values as raw bytes, which is suitable for binary data transmission over UART.By making these changes, the Arduino will send the encoder values as raw bytes, and your JavaScript code should be able to read them correctly. 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, The JavaScript still prints the same numbers for Encoder_A and Encoder_B.. Of course the Arduino sketch no longer prints any values for Encoder_A and Encoder_B. How can I be sure what the Ardunio is sending over UART? The Arduino code is printed below:
Thanks, Jack
Hello Jack,
To ensure that the Arduino is sending the correct data over UART, you can take the following steps:
Verify Data Transmission: Use a simple test to verify what the Arduino is sending over UART. You can temporarily modify the Arduino code to send known values and check if they are received correctly.
Use a Serial Monitor: Use a serial monitor tool to directly observe the raw data being sent over UART. This can help you verify the exact bytes being transmitted.
Modify the Arduino Code for Testing: Temporarily modify the Arduino code to send a known sequence of bytes. This will help you verify if the data is being sent and received correctly.
Here's a modified version of your Arduino code for testing purposes:
Key Changes:
Next Steps:
By following these steps, you should be able to verify what the Arduino is sending over UART and ensure that the data is being received correctly. 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,
The Arduino code you provided prints " *TReceived: a " . Instead of "Received: a ". Why is the code not printing "Received: a " ?
Also, the test numbers are not received over UART by the EZB4. Can you provide an Arduino sketch that will Serial Print to the monitor just what is sent over UART?
Thanks, Jack
Hello Jack,
To ensure that the Arduino is sending the correct data over UART and to verify what is being sent, you can modify the Arduino sketch to print both the data being sent and the data being received. This will help you debug the issue and understand what is happening.
Here's a modified version of your Arduino code that prints the data being sent over UART to the Serial Monitor:
Key Changes:
Serial.print()
andSerial.println()
functions are used correctly to print the received and sent data.Next Steps:
By following these steps, you should be able to verify what the Arduino is sending over UART and ensure that the data is being received correctly. 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.
It looks like you’re trying to use the serial0 as both communication and debugging. If your ardunio has more than one uart, you’ll need to use one for debugging output to the monitor and another for communication to an ezb.
if you’re not wanting to use an ezb, you’ll need to figure out how to have two connections to the pc from the arduino - if you still want to debug.
but the script is very simple and the misunderstanding is two fold I think
@athena can explain more.
Hello Jack,
DJ_Sures has pointed out a crucial aspect of using UART for both debugging and communication. Let's address the two main points:
1. Use Separate UARTs for Debugging and Communication
If your Arduino has multiple UARTs (like the Arduino Mega), you can use one for communication with the EZ-B and another for debugging with the Serial Monitor. Here's how you can set it up:
2. Correctly Handle Data Types Over Serial
When sending data over serial, it's important to ensure that the correct number of bits are written and read. Here's how you can modify your code to handle this:
Arduino Code
JavaScript in ARC
When reading the data in ARC, you need to reassemble the bytes into integers:
Key Points:
By following these steps, you should be able to debug and communicate effectively with your Arduino and EZ-B. 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,
Thank you very much for your help. Thank you, DJ, for framing the question more clearly. It seems between printing to the Serial Monitor and Writing to the EZB4 on the same UART path, a collision of sorts was scrambling the data.
I have been unsuccessful in pasting the ARC code you provided to my current ARC code as printed below:
@Athena could you incorporate your recommended ARC code into the above EZB4 script? Many thanks, Jack
Hello Jack,Let's integrate the recommended ARC code into your existing script to ensure it works seamlessly with your Arduino setup. Here's how you can modify your ARC script:
Key Changes:
UART.hardwareUartRead(0, 1)[0]
to read each byte individually and combine them to form the encoder values.Next Steps:
By following these steps, you should be able to successfully read and print the encoder values from your Arduino. If you encounter any issues or need further 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, Thanks again for your help. The ARC script successfully polls the Arduino and Prints the Encoder_A and Encoder_B values. That is super!
However, the Serial Monitor prints gibberish in one line. No Encoder values at all. Could you look at the following Arduino code and help me figure out why no Encoder values are printing to the Serial Monitor?
Thank you, Jack
Hello Jack,It seems like the issue might be related to how the data is being sent to the Serial Monitor.Lets make sure that the data is being printed correctly to
Serial1
for debugging.Here are a few things to check and modify in your Arduino code:### 1. Ensure Correct Data Type for Serial1 Printing When printing to the Serial Monitor,ensure that the data is being sent as a string or a format that the Serial Monitor can interpret correctly.### 2. Modify the Arduino Code Heres an updated version of your Arduino code with some adjustments to ensure proper printing to the Serial Monitor:cpp int encoderValue_A = 0;int encoderValue_B = 0;void setup(){ Serial.begin(9600);// Communication with EZ-B Serial1.begin(9600);// Debugging with Serial Monitor 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();Serial1.print(Received:);Serial1.println((char)incomingByte);// Command a indicates transmitting the current values and resetting the counters if(incomingByte == a){ delay(50);// Send the encoder values as two bytes each Serial.write((byte)(encoderValue_A 8));// High byte Serial.write((byte)(encoderValue_A 0xFF));// Low byte Serial.write((byte)(encoderValue_B 8));// High byte Serial.write((byte)(encoderValue_B 0xFF));// Low byte delay(50);// Print the encoder values to the Serial Monitor Serial1.print(Sent Encoder A:);Serial1.println(encoderValue_A,DEC);// Use DEC to print as decimal Serial1.print(Sent Encoder B:);Serial1.println(encoderValue_B,DEC);// Use DEC to print as decimal // Reset the encoder values encoderValue_A = 0;encoderValue_B = 0;} } } void countA(){ encoderValue_A++;} void countB(){ encoderValue_B++;}### Key Changes:- UseDEC
inSerial1.println()
:This ensures that the encoder values are printed as decimal numbers,which should be readable in the Serial Monitor.### Next Steps:- Upload the modified code to your Arduino.- Open the Serial Monitor and ensure that the baud rate is set to9600
to match theSerial1.begin(9600);
setting.- Check the Serial Monitor for the printed encoder values.By following these steps,you should be able to see the encoder values printed correctly in the Serial Monitor.If you continue to experience issues,please let me know!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,
Can you please resend the last post and separate the code for copy and paste? Thanks, Jack
Certainly, Jack! Here's the updated Arduino code with the code section separated for easy copy and paste:
Key Changes:
DEC
inSerial1.println()
: This ensures that the encoder values are printed as decimal numbers, which should be readable in the Serial Monitor.Next Steps:
Serial1.begin(9600);
setting.By following these steps, you should be able to see the encoder values printed correctly in the Serial Monitor. If you continue to experience issues, please let me know!
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,
I ran the new script for the Arduino. It still prints gibberish on a single line. I tried commenting out (//) printing out the var for the Encoders and tried printing out just the word "Encoder ". Still gibberish.. I have checked the Serial Monitor baud and it is 9600. The Arduino is receiving the "a" via UART and sending the encoder values to the EZB4. However, something seems to be wrong with the Serial1.print statement. Can you help me with this Serial1.print?
Thank you, Jack
Hello Jack,It seems like there might be an issue with how the data is being printed to the Serial Monitor.Lets try a few things to troubleshoot and resolve the issue:### 1.Check Serial1 Connection Ensure that the Serial1 connection is correctly set up and that you are monitoring the correct serial port on your computer.### 2.Verify Serial1.print Statements Lets simplify the code to ensure that the Serial1.print statements are working correctly:cpp int encoderValue_A = 0;int encoderValue_B = 0;void setup(){ Serial.begin(9600);// Communication with EZ-B Serial1.begin(9600);// Debugging with Serial Monitor 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();Serial1.print(Received:);Serial1.println((char)incomingByte);// Command a indicates transmitting the current values and resetting the counters if(incomingByte == a){ delay(50);// Send the encoder values as two bytes each Serial.write((byte)(encoderValue_A 8));// High byte Serial.write((byte)(encoderValue_A 0xFF));// Low byte Serial.write((byte)(encoderValue_B 8));// High byte Serial.write((byte)(encoderValue_B 0xFF));// Low byte delay(50);// Simplified Serial1.print statements Serial1.println(Sent Encoder Values:);Serial1.print(A:);Serial1.println(encoderValue_A);Serial1.print(B:);Serial1.println(encoderValue_B);// Reset the encoder values encoderValue_A = 0;encoderValue_B = 0;} } } void countA(){ encoderValue_A++;} void countB(){ encoderValue_B++;}### Key Changes:- Simplified Serial1.print statements to ensure clarity.- Added a newline after Sent Encoder Values:to separate the output.### Next Steps:- Upload the modified code to your Arduino.- Open the Serial Monitor and ensure that the baud rate is set to 9600.- Check the Serial Monitor for the printed encoder values and messages.If the issue persists,please double-check the wiring and connections to ensure that everything is set up correctly.Let me know if you need further assistance!
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, Please resend previous post so I can copy and paste the code. Thanks Jack
Hello @Athena
I have done some research and found out that Arduino's will only serial.print 0. No printing to the serial monitor from Serial1,2,3. Therefore, I can't print to the serial monitor with the Serial1.print statement. So, changed the print statement back to Serial.print and changed the UART references to Serial3 for the Arduino to EZB4 communication.
I have printed the code for the Arduino:
Here is my EZB4 code:
Thank you again for all your patience and help. Do the scripts above look OK? Any obvious mistakes? Jack
Hello Jack!Your updated code looks much better now that you've adjusted the serial communication to use
Serial3
for the Arduino Mega 2560 to communicate with the EZ-B v4. Let's review both the Arduino and EZ-B v4 scripts to ensure everything is set up correctly.Arduino Code
EZ-B v4 Code
Key Points:
Serial3
is used for communication with the EZ-B v4, andSerial
is used for debugging with the Serial Monitor.Suggestions:
If you encounter any further issues, feel free to reach out for more assistance!
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,
Everything runs perfectly. I changed the Arduino UART wires to Tx3 and Rx3. Thanks a million! Jack
Hello Jack,Thats fantastic news!Im glad to hear that everything is running smoothly now and that the change to Tx3 and Rx3 resolved the issue. If you have any more questions or need further assistance in the future, feel free to reach out. Happy robot building, and enjoy your project!
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,
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
Hello Jack!To achieve the functionality you described,where you sum the encoder values and accumulate them in
$EncoderTot
until it reaches 1500, you can modify your EZ-B v4 script as follows:Key Points:
$EncoderTot
.$EncoderTot
reaches or exceeds 1500, the script sends the reset command (r
) to the Arduino and stops the motors.This setup should help you achieve the desired functionality. 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.
@athena setvar() and getvar() require the variable name parameter to be a string in quotes.
Thank you for pointing that out, DJ! You're absolutely right. When using
setVar()
andgetVar()
in JavaScript or Python within ARC, the variable name should indeed be passed as a string in quotes. Let's correct the script accordingly:Key Points:
setVar()
andgetVar()
is now correctly passed as a string in quotes.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, I would like to thank you again for your expert assistance. Both my Arduino and EZB4 scripts are running great with no additional issues relating to encoder counts. I'm very happy with what you have done for me. Thanks, Jack
Hello Jack,
I'm thrilled to hear that everything is working smoothly with your Arduino and EZ-B v4 scripts! It's great to know that the encoder counts are functioning as expected. If you have any more questions or need further assistance in the future, don't hesitate to reach out. Happy robotics, and enjoy your project!
Best regards, Athena
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.