У меня есть проблема при попытке отправить некоторые последовательные данные через tx и rx другому arduino через модуль Bluetooth HC05.
В целом проект разрабатывает гибридный картинг и использует arduino в качестве простого блока ECU с ПИД-регулированием скорости на выходе ШИМ, управляющем двигателем постоянного тока.Я работал над проектом поэтапно и зашел так далеко, что установил педаль с помощью Arduino и управлял электронным регулятором скорости (ESC) напрямую.Я добавил к этому простую функцию PID вместе с простым датчиком Холла для определения скорости и требует настройки, но пока отлично работает.Теперь проблема возникает, когда я пытаюсь отправить данные через последовательные порты.
Мне удалось подключить модули Bluetooth для разделения arduinos, и мне удалось отправить данные из одного arduino с входом банка в другой с 3,5-дюймовым TFT-экраном.Когда я пытаюсь интегрировать главную сторону проекта в двигатель постоянного тока с ПИД-регулированием, система зависает.С тех пор я удалил ПИД-регулятор и вернулся к прямому управлению, и он все еще не работает, я попытался закомментировать последовательность прерываний для кодера и установить статическое значение для числа оборотов в минуту и все еще зависает.последовательность отправки работает, если я не пытаюсь использовать какие-либо цифровые выходы.Я действительно смущен.Код, к которому я обратился, чтобы попытаться отладить его, можно найти ниже.Это не полный код, и он был разбит на куски, чтобы попытаться устранить эту ошибку.однако в приведенном ниже коде, если я закомментирую функцию sendData, система работает, и двигатель вращается с относительной скоростью относительно входа педали.как только я пытаюсь отправить данные, система работает в течение нескольких секунд, затем останавливается.данные все еще отправляются, и статические показания показывают, что только цифровой выход захватывает для работы.
#include <TimerOne.h>
int previous = 0;
int Tavg = 0; // the average
int Tout = 0;
int throttle = A0;
const int numReadings = 10;
int readings[numReadings]; // the readings from the analog input
int readIndex = 0; // the index of the current reading
int total = 0; // the running total
int ESCPin = 5;
unsigned int counter=0;
int RPM;
long Time = 0;
long ReadInt = 0;
void docount() // counts from the speed sensor
{
counter++; // increase +1 the counter value
}
void timerIsr()
{
Timer1.detachInterrupt(); //stop the timer
Serial.print("Motor Speed: ");
RPM = (counter*75 ); // RPM= counterx10*60/8 (x10 for second, 8 counts in encoder, 60 minutes === 75x counter)
Serial.print(RPM);
Serial.println(" Rotation per min"); Serial.print(Tout);Serial.print("= "); Serial.print(Tout*0.01961);Serial.println("V");
counter=0; // reset counter to zero
Timer1.attachInterrupt( timerIsr ); //enable the timer
}
void ReadEnc (){
Timer1.initialize(100000); // set timer for 0.1sec
attachInterrupt(0, docount, RISING); // increase counter when speed sensor pin goes High
Timer1.attachInterrupt( timerIsr ); // enable the timer
}
void sendData(){
if (Serial.available()>0) {
if (Serial.read() == 0){
//Serial.println(sendChars);
int RPMout = RPM;
Serial.write("<");
//delay(2);
//Serial.write(sendChars);
Serial.write("Data is,");
//delay(2);
Serial.write( itoa (RPMout, 4,10));
//delay(2);
Serial.write(", 30, 48.35");
//delay(2);
Serial.write(">");
//delay(10);
Serial.println("");
}
}
}
void setup()
{
Serial.begin(9600);
pinMode(2, INPUT_PULLUP); // internal pullup input pin 2
pinMode(ESCPin, OUTPUT);
for (int thisReading = 0; thisReading < numReadings; thisReading++) {
readings[thisReading] = 0; }
Time = millis();
ReadInt = -100;
}
void ReadSensor (){
// get the sensor value
total = total - readings[readIndex];
// read from the sensor:
readings[readIndex] = analogRead(throttle);
//Serial.println(readings[readIndex]);
// add the reading to the total:
total = total + readings[readIndex];
// advance to the next position in the array:
readIndex = readIndex + 1;
// if we're at the end of the array...
if (readIndex >= numReadings) {
// ...wrap around to the beginning:
readIndex = 0;
}
// calculate the average:
Tavg = total / numReadings;
}
void loop(){
ReadSensor();
ReadEnc();
RPM = 1800;
Tout = map(Tavg, 180, 860, 0, 200);
if (Tout>0){
analogWrite(ESCPin, Tout);
}
if (Time > ReadInt + 5000) {
sendData (); // when this is commented it works fine, tried moving it everywhere
ReadInt = Time;
}
Time = millis();
}
Если у кого-то есть какие-либо идеи, пожалуйста, дайте мне знать, и я знаю, что, вероятно, я не очень хорошо объяснил свою проблему, поэтому, если у них есть какие-либо вопросы или требуется дополнительная информация, пожалуйста, спросите.