Использование объектов (для которых требуется параметр) и их методов в другом классе

Я пытаюсь запрограммировать всенаправленного робота с помощью BeagleBone Black. Я обнаружил, что библиотека BlackLib действительно хорошо работает для управления выводами, но у меня возникли небольшие проблемы при интеграции ее в более широкую схему. Если я просто создаю объекты, связанные с булавками, и устанавливаю их высокими или низкими (или где-то посередине), я могу управлять двигателем по своему усмотрению. Но когда я пытаюсь создать объект, содержащий объекты BlackLib, я сталкиваюсь с трудностями. Мне кажется, хороший способ сделать это — создать объект двигателя, который содержит GPIO и объект PWM BlackLib. Тогда я могу создать функцию, чтобы легко установить мощность и направление с

rightMotor(50); //Should set the power to 50% in one direction

У меня кое-что работает, но у меня проблемы с доступом к функциям в объектах из BlackLib, которые находятся в моем собственном классе Motors.

Вот код, с которым я сейчас работаю.

#include "BlackLib/BlackLib.h"
struct Motors
{
BlackPWM* pwm;
BlackGPIO* gpio;

void drive(int power)
{
if(power >= 0)
{
gpio.setValue(low);
//gpio.setValue(low); generates the error described below. I'm not familiar enough with the intricacies of pointers to know how to handle this
//motors.cpp: In member function ‘void Motors::drive(int)’:
//motors.cpp:15:10: error: request for member ‘setValue’ in ‘((Motors*)this)->Motors::gpio’, which is of non-class type ‘BlackGPIO*’
//      pwm.setDutyPercent(power);
}
else
{
//      gpio.setValue(high);
//      pwm.setDutyPercent(100+power);
}
}
};

int main()
{
struct Motors rightMotor;
rightMotor.pwm = new BlackPWM(P9_16);
rightMotor.gpio = new BlackGPIO(GPIO_49,output);

//Give the BeagleBone a little time to create the objects
usleep(10000);

rightMotor.pwm.setPeriodTime(500000);
//I will eventually need to set the period time but I'm not sure how. I'm guessing this is the incorrect syntax
//Ideally, I would create a function so that I could simply write rightMotor.setPeriodTime(500000);

rightMotor.drive(50);
sleep(1);
rightMotor.drive(0);
}

Если я не в курсе дела и есть гораздо лучший способ сделать это, пожалуйста, дайте мне знать. Моя конечная цель — легко управлять несколькими двигателями. В конце концов я хотел бы создать функции и классы, такие как

robot.turn(30);

или же

robot.forward(100);

0

Решение

Получил следующее решение от профессора информатики в университете Аляски Фэрбенкс. Работает как хотелось бы сейчас.

struct Motors
{
BlackPWM pwm;
BlackGPIO gpio;

Motors(pwm_pin_name pwmPin,gpio_name gpioPin) //motor constructor parameters
: pwm(pwmPin),gpio(gpioPin,output) //member initializer list
{
pwm.setPeriodTime(500000);
}

void drive(int power)
{
if(power >= 0)
{
gpio.setValue(low);
pwm.setDutyPercent(power);
}
else
{
gpio.setValue(high);
pwm.setDutyPercent(100+power);
}
}
};

int main()
{
//User interface pins
BlackGPIO button(GPIO_44,input);

Motors rightMotor(P9_16,GPIO_49);

while(!button.isHigh())
{
rightMotor.drive(0);
}

//The BeagleBone needs a little time to create the PWM object
usleep(10000);

rightMotor.drive(-50);

sleep(1);

rightMotor.drive(0);
}
0

Другие решения


По вопросам рекламы [email protected]