Это кратчайшая история времени превращения робота-газонокосилки в DIY снегоуборщик с управлением по Bluetooth с Android телефона.
Это уже третий вариант снегоуборщика. Первый вариант я сделал из боевого робота. Второй вариант из газонокосилки, которую я готовлю к конкурсу. Видео с краткой презентацией этих «изделий» уже было на Geektimes, так же в спойлере внизу поста.
Текущая конструкция робота очень простая. Верхний слой снега снимается скребком. Нижний слой выбрасывается из-под снегоуборщика вбок. Силовым агрегатом служит двигатель внутреннего сгорания от ручной газонокосилки мощностью 0.9 л.с. Ходовые двигатели — это мотор-редукторы от стеклоочистителей ВАЗ. ДВС крутит винт. Воздушный поток и механическое воздействие винта поднимает снег с поверхности и по воздуховоду отбрасывает в сторону. Юбка вокруг снегоуборщика не дает снегу разлетаться в стороны. Шурупованная резина существенно улучшает проходимость агрегата.
Управление
Управлением по Bluetooth с Android телефона. Arduino nano+Monster Motor Shield+Bluetooth HC-06
Bluetooth HC-06 работает на 3.3В, т.е. необходимо для правильной работы сделать преобразование логических уровней. Без этого схема будет работать, но могут быть проблемы.
По поводу Monster Motor Shield много спорных вопросов, кто-то утверждал, что большой процент брака. Мне данная плата очень нравится, потому что она держит ток до 30А.
Arduino
Для получения данных от Bluetooth HC-06 я использовал Software Serial для того чтобы оставить возможность отладки через терминал по аппаратному Serial port. Это, в частности, понадобилось чтобы отслеживать какие данные мы получаем от Arduino. В простейшем скетче проверяем полученный символ по Bluetooth и включаем драйвер двигателей.
#include <SoftwareSerial.h>
#define BRAKEVCC 0
#define CW 1
#define CCW 2
#define BRAKEGND 3
#define CS_THRESHOLD 100
int inApin[2] = {7, 4}; // INA: Clockwise input
int inBpin[2] = {8, 9}; // INB: Counter-clockwise input
int pwmpin[2] = {5, 6}; // PWM input
int statpin = 10;
SoftwareSerial mySerial(2, 3); // RX, TX
char a,b;
void setup()
{
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
pinMode(statpin, OUTPUT);
// Initialize digital pins as outputs
for (int i=0; i<2; i++)
{
pinMode(inApin[i], OUTPUT);
pinMode(inBpin[i], OUTPUT);
pinMode(pwmpin[i], OUTPUT);
}
// Initialize braked
for (int i=0; i<2; i++)
{
digitalWrite(inApin[i], LOW);
digitalWrite(inBpin[i], LOW);
}
// set the data rate for the SoftwareSerial port
mySerial.begin(9600);
mySerial.println("Hello, world?");
}
void loop() // run over and over
{
digitalWrite(statpin, HIGH);
if (mySerial.available()){
a=mySerial.read();
if(a=='F'){
motorGo(0, CW, 1023);
motorGo(1, CW, 1023);
}
if(a=='B'){
motorGo(0, CCW, 1023);
motorGo(1, CCW, 1023);
}
if(a=='L'){
motorGo(0, CW, 1023);
motorGo(1, CCW, 1023);
}
if(a=='R'){
motorGo(0, CCW, 1023);
motorGo(1, CW, 1023);
}
if(a=='I'){
motorGo(0, CW, 500);
motorGo(1, CW, 1023);
}
if(a=='G'){
motorGo(0, CW, 1023);
motorGo(1, CW, 500);
}
if(a=='H'){
motorGo(0, CCW, 1023);
motorGo(1, CCW, 500);
}
if(a=='J'){
motorGo(0, CCW, 500);
motorGo(1, CCW, 1023);
}
if(a=='S'){
motorOff(1);
motorOff(2);
}
Serial.write(a);
}else{
}
}
void motorOff(int motor)
{
// Initialize braked
for (int i=0; i<2; i++)
{
digitalWrite(inApin[i], LOW);
digitalWrite(inBpin[i], LOW);
}
analogWrite(pwmpin[motor], 0);
}
void motorGo(uint8_t motor, uint8_t direct, uint8_t pwm)
{
if (motor <= 1)
{
if (direct <=4)
{
// Set inA[motor]
if (direct <=1)
digitalWrite(inApin[motor], HIGH);
else
digitalWrite(inApin[motor], LOW);
// Set inB[motor]
if ((direct==0)||(direct==2))
digitalWrite(inBpin[motor], HIGH);
else
digitalWrite(inBpin[motor], LOW);
analogWrite(pwmpin[motor], pwm);
}
}
}
Andoid
На Google Play огромное количество готовых приложений для удаленного управления. Из всех больше всего мне понравилось это приложение.
Интерфейс
Логика работы приложения
Приложение отправляет каждую секунду код текущей комбинации нажатых кнопок по bluetooth.
- «S» — стоп
- «F» — вперед
- «B» — назад
- «L» — влево
- «R» — вправо
- «I» — вперед и вправо
- «G» — вперед и влево
- «H» — назад и вправо
- «J» — назад и влево
Управление возможно как с помощью нажатия клавиш, так и с помощью гироскопа. Функционал приложения достаточно тривиальный, но этого достаточно.
Видео
P.S.: Следующим проектом является автономный подводный робот. Я готовлюсь к конкурсу X-Prize. :).Ссылка. Осталось накопить 2000$.
The registration deadline is 30 June, 2016 (11:59 PM UTC/4:59 PM PST). The registration fee is $2,000.00 USD.
Автор: Битва робокосилок