Съдържание:

Програмиране на микро: битов робот и джойстик: битов контролер с MicroPython: 11 стъпки
Програмиране на микро: битов робот и джойстик: битов контролер с MicroPython: 11 стъпки

Видео: Програмиране на микро: битов робот и джойстик: битов контролер с MicroPython: 11 стъпки

Видео: Програмиране на микро: битов робот и джойстик: битов контролер с MicroPython: 11 стъпки
Видео: Уроки Arduino. Работа с энкодером 2024, Ноември
Anonim
Програмиране на микро: битов робот и джойстик: битов контролер с MicroPython
Програмиране на микро: битов робот и джойстик: битов контролер с MicroPython

За Robocamp 2019, нашия летен лагер по роботика, млади хора на възраст 10-13 години запояват, програмират и изграждат BBC микро: битов базиран „антитеглов робот“, както и програмират микро: бит, който да се използва като дистанционно управление.

Ако в момента сте в Robocamp, преминете към Стъпка 3, тъй като направихме първите две стъпки като група

Това е стъпка по стъпка ръководство за получаване на микро: бит робот да комуникира с джойстик: битов контролер.

Не е необходим най -бързият път, за да накарате всичко да работи, но опитва нещата на малки парчета, така че да можете да тествате кода, докато вървите, да поставите свой собствен печат върху него и да разберете защо правим нещата, които правим !

За тази дейност използваме наш собствен персонализиран робот, но той ще работи с всеки робот, използващ подобен драйвер на мотор, като например L9110s.

Дизайн файлове за нашия робот могат да бъдат намерени тук:

Това ръководство е написано за начинаещи, но ако никога преди не сте използвали micro: bit с MicroPython, препоръчваме ви първо да опитате по -опростена програма, като нашата значка с име Instructable: https://www.instructables.com/id/Felt -Microbit-Nam…

Консумативи

2x BBC micro: бит

Робот, който работи с BBC micro: bit (вижте обяснението по -горе)

джойстик: битов контролер (ние получихме нашия от Cool Components)

Стъпка 1: Настройка на робота

Имате няколко опции за писане на MicroPython код за вашия micro: bit:

  • Mu, който можете да изтеглите и инсталирате от тук:
  • Онлайн редакторът, който можете да намерите тук:

Тези инструкции предполагат, че използвате Mu

Отворете Mu и включете micro: bit в компютъра си. Mu трябва да разпознае, че използвате micro: bit и да изберете micro: bit 'Mode', но ако не го направите, променете го ръчно.

изберете режим
изберете режим

Вземете копие от тестовия код на двигателя на робота от тук:

Ако не сте свикнали с Github, това може да е неинтуитивно! Два лесни начина да получите този код са:

  1. Запишете необработения файл на компютъра си, след което го заредете в Mu:
  2. Копирайте и поставете целия даден код в нов файл в Mu.
запазване на необработен файл
запазване на необработен файл

Сега щракнете върху бутона „Flash“от лентата с инструменти на Mu, за да изпратите новия си код до micro: bit.

Това няма да работи, освен ако micro: bit не е включен

Жълтата светлина на гърба на micro: bit ще започне да мига. Когато приключи, вашият код е прехвърлен.

НАСТРОЙКА НА ПОСОКИТЕ НА ДВИГАТЕЛЯ

Тази програма ще включва двигателите в различни посоки, когато натиснете бутона „A“на micro: бита.

Това, което искате да се случи, е:

  • Когато се появи „А“, оставете двигателя напред
  • Когато се появи „B“, оставете двигателя назад
  • Когато се появи „C“, десният двигател напред
  • Когато се появи „D“, десният двигател назад

Това вероятно няма да е така, тъй като зависи от това как сте свързали вашия робот!

В горната част на кода ще намерите списък с променливи, които определят кой щифт на micro: bit контролира коя посока на двигателя.

Ако използвате някой от нашите роботи (файлове), разменете имената на променливите наоколо, за да накарате робота да се движи в правилните посоки:

разменяйте щифтовите променливи
разменяйте щифтовите променливи

Ако използвате собствен робот, проверете към кои щифтове е свързан драйверът на двигателя, преди да редактирате кода.

ИЗПИТВАНЕ НА ДИСКА

Сега проверете как вашият робот се движи, като замените тестовия код в главния цикъл с някакъв собствен код.

Казвате на робота да кара, като извикате функцията drive (). Това изисква два аргумента - стойност за левия двигател и стойност за десните двигатели, между 0 (изключено) и 1023 (максимална скорост).

Като извикате задвижване (500, 500) например, казвате на двата двигателя да се включат в посока напред с около половин скорост.

Изпробвайте няколко варианта, за да усетите колко правилно се движи и колко добре се върти.

Съвет: моторните тестове бяха вътре както в цикъл True, така и в оператор if - двигателите нямаше да се въртят, докато не натиснете бутона A на micro: бита и той завинаги проверява дали сте натиснали бутона A.

Съвет: двигателите няма да се изключат, докато не им кажете! Те винаги ще продължават да изпълняват последната си инструкция.

ОПЦИЯ: ПОДОБРЯВАНЕ НА ШОФИРАНЕТО НА ПРАВА ЛИНИЯ

Ако вашият робот няма да кара по права линия, един от двигателите ви може да се върти по -бързо от другия.

След като проверите дали нищо не спира физически колелото да се върти свободно, можете да редактирате кода във функцията за задвижване, за да намалите скоростта на по -бързия двигател.

Превъртете нагоре, за да намерите дефиницията на функцията за задвижване, и погледнете първите две инструкции:

def задвижване (L, R):

# По -долу е дадена корекция за коригиране на разминаването в скоростта на двигателя L = int (L*1) R = int (R*1)

Тези два реда в момента приемат стойността на L и R, умножават ги по 1, след което се уверете, че все още са цели числа (int).

Например, ако левият ви двигател е по -бърз, променете *1 на линията му на *0,9 и вижте дали това подобрява нещата.

Няма да можете да го направите перфектен, но можете да продължите да се настройвате, докато закара по -изправено.

НАСТРОЙКА НА РАДИОТО

Сега настройте радиото, като добавите следните редове в горната част на кода си:

внос на радио

radio.config (канал = 7, група = 0, опашка = 1) radio.on ()

Това ще позволи на вашия робот да получава инструкции от друг micro: bit, но в момента той ще получава инструкции от всеки друг micro: bit.

Това е така, защото канал 7 и група 0 са каналите по подразбиране.

Променете тези числа, като изберете канал между 0-82 и група между 0-255. Сега вашият micro: bit ще получава инструкции само от други със същата конфигурационна информация.

queue = 1 означава, че micro: bit ще запази само едно входящо съобщение наведнъж - това дава малко по -бързо време за отговор от стандартното, което е 3.

Сега трябва да редактирате основния си цикъл, вместо да изпълнявате инструкции при натискане на бутон, да изчакате входящо радио съобщение и да реагирате по подходящ начин.

Опитайте следния код като тест (той няма да направи нищо, докато не настроите джойстика в стъпка 2):

докато е вярно:

message = radio.receive () if message == 'forward': drive (500, 500)

Стъпка 2: Настройка на джойстика

Изключете micro: bit на вашия робот и вместо това включете micro: bit на джойстика си

Вземете копие от кода за настройка на джойстика от тук:

Настройте радиото със същата конфигурация (номер на канал и група), както сте направили за робота - това ще позволи на двамата да комуникират помежду си.

В края на програмата стартирайте основния си цикъл:

докато е вярно:

if button_a.was_pressed (): radio.send ('forward')

Този код все още не използва джойстика: bit. Той използва бутон А на micro: bit, за да изпрати съобщение.

Уверете се, че вашият робот и вашият micro: бит на контролера имат захранване, след това натиснете бутона, за да изпратите съобщението си.

Ако съобщението е получено успешно и вашият робот се движи … браво! Приключихте с инструкциите за настройка.

СЪВЕТИ ЗА ОТСТРАНЯВАНЕ НА НЕИЗПРАВНОСТИ

Ако получите съобщение за грешка на вашия контролер micro: bit … отстранете грешката в кода на вашия контролер

Ако получите съобщение за грешка на вашия робот micro: bit … вашето радио съобщение е изпратено успешно! Но роботът не може да го разбере, така че проверете дали съобщението, което сте изпратили, и съобщението, което сте казали на робота да изслуша за съвпадение.

Ако изобщо нищо не се случи

  • Уверете се, че сте прехвърлили правилния код към всеки micro: бит - лесно е случайно да премигнете грешния!
  • Уверете се, че номерата на вашия канал и група съвпадат на всеки micro: бит

Стъпка 3: Проверка на стойностите на джойстика

Следващите няколко стъпки използват кода на контролера

Преди да можете да използвате джойстика на вашия контролер, трябва да знаете какви стойности получавате, когато натискате пръчката.

Заменете основния си цикъл със следния код:

докато е вярно:

джойстик = joystick_push () печат (джойстик) сън (500)

Прехвърлете този код към вашия micro: bit, след което щракнете върху бутона REPL на лентата с инструменти на Mu. Това ще отвори терминал в долната част на редактора, който ви дава връзка в реално време към micro: bit.

отворете REPL
отворете REPL

Това няма да работи, освен ако micro: bit не е включен

При отворен REPL натиснете бутона за нулиране на гърба на вашия micro: bit.

Образ
Образ

Трябва да видите, че някои стойности показват „отпечатано“на екрана ви:

стойности в терминала
стойности в терминала

Натиснете пръчката на джойстика и вижте какво се случва с числата.

Забележете стойностите, дадени, когато джойстика е в централна позиция - в моя случай (518, 523).

Щракнете отново върху бутона REPL на лентата с инструменти на Mu, за да я затворите - няма да можете да мигате нов код към micro: bit, докато е отворен.

Стъпка 4: Регулиране на променливите X и Y

Искате да промените стойностите, зададени от функцията на джойстика, така че:

  • в центъра е нула
  • нагоре е положително
  • надолу е отрицателно.

Това съответства на инструкциите, от които се нуждае роботът - положително число за движение напред и отрицателно число за шофиране назад.

Вижте числата, които сте получили в последната стъпка. Първото число е x, а второто число е y.

Редактирайте определението на joystick_push (), което вече е в програмата, за да намалите стойностите си от оригинала:

def joystick_push ():

x = pin0.read_analog () - 518 y = pin1.read_analog () - 523 връщане x, y

Използвайте свои собствени номера, те може да са различни от моите

Мигайте с новия си код, отворете REPL, натиснете бутона за нулиране на micro: bit и проверете стойностите си.

Получавате ли (0, 0)?

Стъпка 5: Преобразуване на X и Y в стойности за левия и десния двигател

В момента този джойстик няма да бъде много полезен за шофиране на робот. Натиснат напред докрай, ще получите стойност като (0, 500).

Ако дадете тези числа на робота, той ще включи десния двигател, но не и левия, което не е това, което искате да се случи!

Тази диаграма показва какво се случва със стойностите x и y, когато преместите джойстика, и какво искаме да направи роботът, когато преместите джойстика.

диаграма
диаграма

Трябва да използвате някои математики, за да смесите стойностите x и y, за да получите нещо по -полезно.

н

МАТЕМАТИКАТА

Нека започнем с натискане на джойстика докрай напред.

Пример за стойностите, които може да получите, е:

x = 0

y = 500

За да бъдете полезни за робота, искате да получите стойности като тези:

ляво = 500

вдясно = 500

Нека се опитаме да добавим x и y по различни начини, за да видим какви числа получаваме:

x + y = 0 + 500 = 500

x - y = 0 - 500 = -500 y + x = 500 + 0 = 500 y - x = 500 - 0 = 500

Сега да видим какво ще се случи, ако натиснем джойстика докрай надясно.

Пример за стойностите, които може да получите, е:

x = 500

y = 0

За да накарате робота да завие надясно, искате левият мотор да се движи напред, а десният да се движи назад:

ляво = 500

вдясно = -500

Нека отново изпробваме формулата:

x + y = 500 + 0 = 500

x - y = 500 - 0 = 500 y + x = 0 + 500 = 500 y - x = 0 - 500 = -500

Сравнете двата набора формули, за да разберете коя опция ще ви даде правилната лява стойност и коя опция ще ви даде правилната дясна стойност.

Опитайте с някои от стойностите, които получавате от собствения си джойстик, за да сте сигурни, че формулата, която избирате, работи през цялото време.

н

РАЗШИРЯВАНЕ НА ФУНКЦИЯТА НА JOYSTICK

Разширете и редактирайте функцията на джойстика, за да направите две нови променливи за ляво и дясно и да върнете тези стойности вместо x и y:

def joystick_push ():

x = pin0.read_analog () - 518 y = pin1.read_analog () - 523 наляво = надясно = връщане наляво, надясно

Мигайте с новия си код, отворете REPL, натиснете бутона за нулиране на micro: bit и проверете стойностите си.

Получавате ли стойностите, които очаквате?

Ако имате нужда от още помощ, разгледайте нашия примерен код тук:

Стъпка 6: Изпращане на стойностите като радио съобщения

Сега имате някои стойности, готови да изпратите на вашия робот.

Редактирайте основния си цикъл, така че да проверява стойностите на джойстика, но след това вместо да отпечата стойностите, той ги подготвя за изпращане като радио съобщение.

докато е вярно:

джойстик = joystick_push () съобщение = str (джойстик [0]) + "" + str (джойстик [1])

Това всъщност още няма да изпрати съобщението!

Какво се случва в този нов ред код?

  • джойстик [0] означава първият бит информация, който излиза от функцията на джойстика (вляво)
  • джойстик [1] е следващият бит информация (вдясно)
  • str () преобразува и двата номера в низов формат (текст вместо числа) - това е необходимо, за да може да се изпраща информацията по радиото.

Ще сте свикнали да виждате + да означава добавяне - може да добавя числа заедно и да свързва низове, което означава, че ще залепи двата бита информация заедно.

Пример:

150 + 100 = 250

str (150) + str (100) = 150100

Така че конкатенацията ще залепи вашите леви и десни стойности заедно.

За да принудите разделянето между двата бита информация (така че роботът да знае, че са два бита информация), съединете допълнителен низ между тях, като използвате "". Речевите знаци около пространството означават, че то вече е низ.

И накрая, удължете кода си, за да изпратите новосъздаденото съобщение по радиото:

radio.send (съобщение)

сън (10)

Сънят забавя изпращането на съобщения, така че получаващият micro: bit да не се претоварва с твърде много информация!

Прехвърлете този код към вашия контролер micro: bit и отстранете грешките, преди да преминете към следващата стъпка

Стъпка 7: Получаване на съобщенията на вашия робот

Върнете се към кода на робота от самото начало - не забравяйте да изключите контролера micro: bit, за да не случайно мигате кода на робота към него

Превъртете надолу до основния си цикъл - премахнете кода за тестване и вместо това добавете това:

докато е вярно:

message = radio.receive () печат (съобщение) sleep (100)

Това задава променлива, равна на входящото съобщение, и отпечатва съобщението в REPL - за да провери дали съобщенията преминават според очакванията.

Мигайте с новия си код, свързан с REPL, след това натиснете джойстика.

Трябва да получите нещо подобно:

REPL стойности
REPL стойности

СЪВЕТИ ЗА ОТСТРАНЯВАНЕ НА НЕИЗПРАВНОСТИ

Ако получите съобщение за грешка на вашия контролер micro: bit … отстранете грешката в кода на вашия контролер

Ако получите съобщение за грешка на вашия робот micro: bit … вашето радио съобщение е изпратено успешно! Но роботът не може да го разбере, така че проверете дали съобщението, което сте изпратили, и съобщението, което сте казали на робота да изслуша за съвпадение.

Ако изобщо нищо не се случи

  • Уверете се, че сте прехвърлили правилния код към всеки micro: бит - лесно е случайно да премигнете грешния!
  • Уверете се, че номерата на вашия канал и група съвпадат на всеки micro: бит

Стъпка 8: Използване на входящите съобщения за управление на двигателите на робота

Сега получавате два номера, изпратени по радиото като низ.

Трябва да разделите това съобщение на два низа, след това да преобразувате низовете отново в числа и да предадете това във функцията за задвижване. Много се случва наведнъж!

Преди да направите това, трябва да проверите дали съобщението, което получавате, е в правилния формат.

Ако не се изпращат съобщения, вместо това ще получите „Няма“. Ако опитате да разделите това, ще получите съобщение за грешка.

докато е вярно:

message = radio.receive () ако съобщението не е None: message = message.split () устройство (int (съобщение [0]), int (съобщение [1]))

Какво става тук?

  • Новият код ще се изпълни, ако съобщението е нещо различно от „Няма“.
  • message.split () проверява за място в съобщението (което добавихме в последната стъпка) и използва това, за да раздели съобщението на две.
  • int (съобщение [0]), int (съобщение [1]) прави обратното на това, което направихме в предишната стъпка - получава всяка информация поотделно и я преобразува в цяло число (цяло число).
  • int (съобщение [0]) се използва като стойност за левия двигател във функцията за задвижване, а int (съобщение [1]) се използва като стойност за десния двигател.

Проверете дали работи - въртят ли се двигателите, когато натиснете джойстика?

Ако не - време за малко отстраняване на грешки!

Ако да, фантастично! Имате работещ робот за дистанционно управление!

Прекарайте известно време в упражнения с вашия робот, преди да преминете към следващата стъпка. Кара ли така, както очаквате?

Следващите стъпки ще ви покажат как да използвате бутоните на джойстика, за да добавите допълнителна функционалност към вашия робот

Ако искате да видите нашата версия на този код досега:

  • Робот:
  • Контролер:

Стъпка 9: Използване на бутоните - получаване на допълнителни съобщения

В момента вашият код ще се опита да раздели всяко съобщение, което не е None. Това означава, че ако получи например „здравей“, тогава ще получите съобщение за грешка.

За да позволите на вашия micro: bit да интерпретира други съобщения, той ще трябва първо да провери всяко очаквано съобщение, след което да го раздели само ако не му е казано да прави нещо друго с него.

Разширете кода си така:

ако съобщението не е None:

if message == 'hello': display.show (Image. HAPPY) elif message == 'duck': display.show (Image. DUCK) else: message = message.split () диск (int (съобщение [0]), int (съобщение [1]))

Първо, той ще провери дали е получил съобщението „здравей“. Ако има, ще покаже щастливо изображение, след което се върнете в горната част на цикъла и проверете за следващото съобщение.

Ако съобщението не е здравей, след това ще провери дали съобщението е „патешко“.

Ако съобщението не е „здравей“ИЛИ „патица“, то ще направи последното нещо в списъка, което ще раздели съобщението и ще включи двигателите. Той няма да се опита да раздели съобщението, ако е получил „здравей“или „патица“, което означава, че няма да получите съобщение за грешка от нито едно от тези две съобщения.

Двойният знак за равенство е важен - означава "е равно на", в сравнение с един знак за равенство, който задава нещо (така че съобщението = "здравей" означава, че задаваме променливата на "здравей", съобщение == "здравей" означава, че питаме дали съобщението е равно на „здравей“).

Опитайте само с две опции засега, за да го тествате - можете да добавите толкова други съобщения, колкото искате по -късно.

Връзка към работен код:

Стъпка 10: Изпращане на допълнителни съобщения с помощта на бутоните на контролера

Изключете micro: bit на вашия робот и вместо това включете micro: bit на джойстика си

Върнете се към кода на вашия контролер, за да редактирате.

Подобно на кода на робота, ние искаме контролерът да провери дали се опитвате да изпратите други съобщения, преди да изпратите стойностите на джойстика.

В горната част на цикъла все още искаме той да проверява текущите стойности на джойстика, но също така искаме да провери дали в момента е натиснат бутон:

докато е вярно:

джойстик = joystick_push () бутон = button_press ()

button_press () връща стойност A, B, C, D, E или F в зависимост от това кой бутон се натиска в момента (ако нищо не се натиска, връща None).

Сега можем да направим изявление if-elif-else, както направихме за кода на робота-използвайки два бутона и изпращайки стойността на джойстика, ако не се натисне бутон.

if button == 'A':

radio.send ('hello') sleep (500) elif button == 'B': radio.send ('duck') sleep (500) else: message = str (джойстик [0]) + "" + str (джойстик [1]) radio.send (съобщение) спящ (10)

Когато се натисне бутон, изпратете едно от съобщенията, които сте казали на робота да внимава в предишната стъпка.

Съобщението ще бъде изпращано при всяко натискане на бутона, а компютрите са много по -бързи от хората! Така че може да изпрати съобщението много пъти, преди да успеете да свалите пръста си от бутона.

Сънят след изпращане на съобщението го забавя, така че да не проверява отново бутона толкова бързо - опитайте няколко номера тук, за да получите идеалното време за вас - твърде бавно и няма да реагира също бързо и вашият робот ще получи толкова много съобщения за бутони, че може да спре да отговаря на джойстика!

Работи ли?

Ако получавате съобщения за грешка, помислете внимателно какво току -що сте променили и какво се случва.

Ако получите грешка на робота, когато натиснете бутон на вашия контролер - знаете, че съобщението се предава, но това обърква робота. Проверете дали съобщението, което сте изпратили, и съобщението, което сте казали на робота да търси, са еднакви.

Връзка към работен код:

Стъпка 11: Следващи стъпки

Вече имате необходимите знания за работа с двигателите на вашия робот и с вашия джойстик: битов контролер

Използвайте тези знания, за да подобрите двете програми и да ги направите свои собствени. Някои идеи по -долу!

Имате шест бутона на вашия контролер! Какво искате да направят?

  • Какво ще кажете за програмиране на танцова рутина, която вашият робот да изпълнява по команда? Напишете алгоритъм от команди drive (), разделени с команди sleep ()!
  • Искате ли да промените посоката, в която се движи роботът, за да може лесно да кара с главата надолу? Помислете за стойностите x и y на вашия джойстик. Какво представляват те и как бихте могли да ги манипулирате?
  • Вашият робот има (или бихте могли да добавите!) Допълнителни функции като светодиоди, високоговорител или сензори?

Идеи за подобряване на кода

  • Бихте ли могли да помогнете на робота си да се справи с непознати съобщения, като използвате код try/except?
  • Математиката, използвана за изчисляване на лявата и дясната стойност от джойстика, не ни дава пълния диапазон от стойности (устройството на робота може да приеме число до 1023). Можете ли да редактирате този код, за да получите по -добър диапазон?
  • Има и други методи за смесване на стойностите на джойстика - можете ли да измислите по -добър начин да го направите?

Препоръчано: