Эй, моделисты, роботехи и сочувствующие! Хотите попробовать что-нибудь по-настоящему большое? Сегодня в домашних условиях из подручных материалов мы построим дирижабль!
Для постройки дирижабля Sverdlov Airship v 0.5 нам потребуется:
1.Ардуино-совместимый контроллер. Мы изготовили MRC28 по материалам сайта robozone.su.
2.Радиомодем с интерфейсом UART. Впрочем, можно летать на проводе RS-232 или USB. Мы купили Aurel-wiz-434. Две штуки — как приемник и передатчик.
3.Оболочка и гелий. В качестве оболочки возьмите радиозонды метеорологические. Поищите в своем городе — в Екб их продает ОАО «Метео» на Студенческой. Если нет — купите на Ебае. Нужны радиозондовые оболочки на 650 грамм — раздуются и поднимут больше. Гелий нужен марки «Б», у нас он продается на техгазе, баллон за 2000 + аренда\покупка баллона.
4.Винты, движки и драйверы к ним. От старых коллекторных помощнее — потянут в тихом помещении без сквозняков. До бесколлекторных, тянущих по 500 грамм.
В нашей альфа-версии стояли движки от советского магнитофона и драйвер к ним с того же робозона. В нынешней — бесколлекторные движки на 7А каждый и соответствующие драйверы к ним, купленные в магазине Пилотаж-RC. Как мы намаялись с подключением драйверов!
5.Сервомотор. Нужен для изменения вектора тяги. Наш выбор Hitec HS-49B, но можете взять любой подходящий.
6.Аккумулятор\батарея. Определитесь по движку. Можно использовать новый литий-полимерный аккум из магазина моделей, можно — 8-16 штук «Крон». Мы брали и то, и другое.
7.Рама. Алюминиевый уголок, полосу и трубу поищите в магазине стройматеиалов. Если кто умеет — может выклеить гондолу из углепластика.
8. Джойстик. Рулить будем именно им.
Изготовьте раму — нарежьте алюминиевый уголок ножовкой и склепайте каркас. Можете свинтить, но пользуйтесь гроверами — двигатели при нашей точности могут дать вибрацию, которая развинтит все крепления. Предусмотрите крепления для серводвигателя, место под вал, опору для электронных компонентов. Не забывайте, что драйверы двигателей нужно охлаждать. Разместите все на отведенных местах.
При достаточной аккуратности, в итоге получится нечто вроде этого:
В верхней половине укреплены батареи и драйвер двигателей (прикручен к раме, как к радиатору). Усилие с сервопривода шестерни передают на вал с закрепленными двигателями. Снизу — контроллер и отдельно лежит радиомодем.
Драйверы двигателей, радиомодем и сервомашинку подключите в соответствующие выходы ардуино.
Залейте прошивку.
#include <Servo.h> // Серва для управления вертикального направления дирижабля // ServoDirigable Servo serDir; // Номер устройства num = 0 int pinSerDir = 2; struct Motor { int dir; // Направление int enable; // Скорость }; Motor motorLeft = {7, 6}; // Номер устройства num = 1 Motor motorRight = {4, 5}; // Номер устройства num = 2 void setup() { //Servo serDir.attach(pinSerDir); //MotorLeft pinMode(motorLeft.dir, OUTPUT); pinMode(motorLeft.enable, OUTPUT); //MotorRight pinMode(motorRight.dir, OUTPUT); pinMode(motorRight.enable, OUTPUT); //Serial Serial.begin(9600); // Выставляем все устройства на исходную позицию serDir.write(90); } void loop() { int num; int pos; if (Serial.available() > 1) { // Считываем номер устройства num = Serial.read(); // Считываем позицию для движения устройства pos = Serial.read(); if(num==0){writeServo(serDir, pos);} if(num==1){writeMotor(motorLeft, pos);} if(num==2){writeMotor(motorRight, pos);} } } void writeServo(Servo ser, int pos) { if(pos>180) {pos = 180;} if(pos<0) {pos=0;} ser.write(pos); } void writeMotor(struct Motor mot, int pos) { if(pos<0){pos=0;} if(pos>255){pos=255;} digitalWrite(mot.dir, HIGH); analogWrite(mot.enable, pos); } int SWread() { byte val = 0; while (digitalRead(rx)); //wait for start bit if (digitalRead(rx) == LOW) { delayMicroseconds(halfBit9600Delay); for (int offset = 0; offset < 8; offset++) { delayMicroseconds(bit9600Delay); val |= digitalRead(rx) << offset; } //wait for stop bit + extra delayMicroseconds(bit9600Delay); delayMicroseconds(bit9600Delay); return val; } }
Подключите к компу джойстик и второй радиомодем. Запустите управляющую программу на питоне.
''' Created on 24.02.2011 @author: pankratov.vs ''' import pygame import serial ser = serial.Serial(port = '/dev/ttyUSB0', baudrate = 9600) motor = 0 turn = 0 def handleJoyEvent(e): global motor global turn if e.type == pygame.JOYAXISMOTION: #X if (e.dict['axis'] == 0): turn = e.dict['value'] motorSpeed = chr(calcSpeed()) if(turn<0): ser.write(chr(1)) ser.write(motorSpeed) ser.write(chr(255)) else: ser.write(chr(2)) ser.write(motorSpeed) ser.write(chr(255)) #Y if (e.dict['axis'] == 1): pos = e.dict['value'] move = round(pos * 90, 0) if (move < 0): servo = int(90 - abs(move)) else: servo = int(move + 90) servoPosition = chr(servo) ser.write(chr(0)) ser.write(servoPosition) ser.write(chr(255)) #uncomment to debug #print servo, servoPosition #Z if (e.dict['axis'] == 2): pos = e.dict['value'] motor = int(round((1-pos)*90)) motorSpeed = chr(calcSpeed()) if(turn==0): lmotor = chr(motor) rmotor = chr(motor) else: if(turn<0): lmotor = chr(calcSpeed()) rmotor = chr(motor) else: lmotor = chr(motor) rmotor = chr(calcSpeed()) ser.write(chr(1)) ser.write(lmotor) ser.write(chr(255)) ser.write(chr(2)) ser.write(rmotor) ser.write(chr(255)) #uncomment to debug #print motorSpeed #Throttle if (e.dict['axis'] == 3): pass elif e.type == pygame.JOYBUTTONDOWN: # uncomment to debug #str = "Button: %d" % (e.dict['button']) #output(str, e.dict['joy']) if (e.dict['button'] == 0): print "Bye!\n" ser.close() quit() def output(line, stick): print "Joystick: %d; %s" % (stick, line) def calcSpeed (): global motor global turn curTurn = int(round(motor * abs(turn))) curSpeed = motor - curTurn return curSpeed def joystickControl(): while True: e = pygame.event.wait() if (e.type == pygame.JOYAXISMOTION or e.type == pygame.JOYBUTTONDOWN): handleJoyEvent(e) def main(): ser.open() ser.isOpen() pygame.joystick.init() pygame.display.init() if not pygame.joystick.get_count(): print "\nPlease connect a joystick and run again.\n" quit() print "\n%d joystick(s) detected." % pygame.joystick.get_count() print chr(1) myjoy = pygame.joystick.Joystick(0) myjoy.init() joystickControl() if __name__ == "__main__": main()
Наполните баллоны гелием - они надуваются в точности, как воздушные шарики в человеческий рост. Двух зондов хватит, чтоб поднять около одного килограмма.
Прикрепите зонды к раме. Ваша цель - добиться минимальной плавучести аппарата. Тогла его можно будет посадить на землю тягой двигателей.
Теперь выведите ваш дирижабль в открытое безветренное пространство - от школьного спортзала до тихого пустыря. А теперь - кораблю - взлет! От винта!
В чем отличия от предыдущей версии?
1.Поставлены бесколлекторные движки с тягой до 600 грамм и драйверы к ним. Теперь он летает быстро.
2.Установлен мощный аккумулятор. Теперь он летает долго.
3.Шары прикреплены к дирижаблю достаточно жестко - с помощью опорной рамы и тесьмы.
4.Управление выведено на джойстик.
5.Наконец, подключен радиомодем.
Над чем работать? Стабилизация движения, повороты, понизить чувствительность управления, научить избегать препятствия.
Опубликовано в журнале сообщества uralrobot.ru
0 комментариев на «“Дирижабль, управляемый с компа — сделай сам!”»
Супер! Отличная работа!
Здорово!!!
Круто!
всётаки оч жду продолжения — Kirov Airship… с вытекающими=)
Мы тоже о них мечтаем. 🙂 И о вытекающих.
Собственно, следующий по компоновке будет напоминать именно Киров.
А где же видео?
Спасибо!