simplethings07 wrote on Tuesday, August 01, 2017:
Hello guys,
I am using AVR-GCC on AVR Atmega2560 uC with FreeRTOS v9. So basically I want to implement a simple radar with ultrasonic sensor and a servo motor. When I run servo motor and ultrasonic sensor on seperate tasks in my main.cpp, everything works just fine. Then I tried to wrap these 2 threads inside Radar class:
Radar::Radar(UltrasonicSensor* ultrasonicSensor, Servo* servo)
{
this->ultrasonicSensor = ultrasonicSensor;
this->servo = servo;
this->objectAngle = 0;
this->objectDistance = 0;
xTaskCreate(
Radar::ultrasonicThread
, NULL // A name just for humans
, 128 // Stack size
, this
, 2 // priority
, NULL );
xTaskCreate(
Radar::servoThread
, NULL // A name just for humans
, 128 // Stack size
, this
, 2 // priority
, NULL );
}
void Radar::ultrasonicThread(void* pvParameters)
{
Radar* radarInstance;
radarInstance = static_cast<class Radar*>(pvParameters);
while (true)
{
radarInstance->ultrasonicSensor->read( &(radarInstance->objectDistance) );
}
}
void Radar::servoThread(void* pvParameters)
{
int8_t angle;
Radar* radarInstance;
radarInstance = static_cast<class Radar*>(pvParameters);
while (true)
{
for ( angle = 0; angle < 180; ++angle )
{
radarInstance->servo->write(angle);
radarInstance->objectAngle = angle;
vTaskDelay(20 / portTICK_PERIOD_MS);
}
for ( angle = 180; angle > 0; --angle )
{
radarInstance->servo->write(angle);
radarInstance->objectAngle = angle;
vTaskDelay(20 / portTICK_PERIOD_MS);
}
}
}
void Radar::open(void) {vTaskStartScheduler();}
int8_t Radar::read(uint8_t* distance, uint8_t* angleInDegres)
{
*angleInDegres = this->objectAngle;
*distance = this->objectDistance;
return 0;
}
You can see that I have servoThread and ultrasonicThread, and I am doing exactly the same thing as I did in my main.cpp, where it worked just fine.
HardwareSerial& btSrialPort = Serial3;
HardwareSerial& pcSerialPort = Serial;
Servo servoMotor;
UltrasonicSensor ultrasonicSensor(trigPin, echoPin);
MessageProcessor messageProcessor(&btSrialPort);
Radar radar(&ultrasonicSensor, &servoMotor);
uint8_t distance;
uint8_t angle;
void radarThread(void* pvParameters)
{
uint8_t angle, distance;
while (true)
{
radar.read(&distance, &angle);
pcSerialPort.println(distance);
}
}
void setup()
{
pcSerialPort.begin (9600);
btSrialPort.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
servoMotor.attach(servoPin);
multiThreadingBootstrap();
}
void loop()
{
}
void multiThreadingBootstrap(void)
{
xTaskCreate(
radarThread
, (const portCHAR *)"Radar" // A name just for humans
, 128 // Stack size
, NULL
, 2 // priority
, NULL );
radar.open();
vTaskStartScheduler();
}
You can see that in function multiThreadingBootstrap I create a new thread called radarThread, which then calls method ** Radar::read**, which returns 2 parameters that are read from two thread methods: Radar::servoThread and Radar::ultrasonicThread.
When I use it this way my ultrasonic sensor acts strangely, it detects objects with delay, servo motor goes only in one direction. Could a problem lay in the fact that I have two threads running inside C++ class and one thread running in my main.cpp ?