BeagleBone Black (BBB) - Quadcopter Dev
BeagleBone Black é uma plataforma de desenvolvimento de baixo custo (entenda-se cerca R$330).
Capaz de dar boot em 10 segundos e pronta para desenvolver em 5 minutos através de conexão USB e API semelhamente ao Arduino.
O processador é um ARM Cortex-A8 de 1GHz com 512MB de DDR3 e 2GB de flash.
Caixa da Beaglebone Black |
Tudo que vem na caixa: encarte, a placa e o cabo USB. |
Face inferior |
Face superior 2 conectores fêmeas de 46 pinos cada. 1 conector macho de 6 pinos (UART para debug) 4 Leds |
A instalação é fácil.
Plugue o cabo USB e instale os drivers (somente para Windows, no Linux é automático):
Windows 7/8/8.1 32 bits
http://beagleboard.org/static/Drivers/Windows/BONE_DRV.exe
Windows 7/8/8.1 64 bits
http://beagleboard.org/static/Drivers/Windows/BONE_D64.exe
Para entrada no ambiente de desenvolvimento estilo Arduino, basta acessar a placa pela rede USB em:
O processador possui 8 saídas PWM, 6 delas podem ser multiplexadas para sair em pinos diferentes do padrão. Usando a tabela fica mais fácil de escolher os pinos, pois além da multiplexação existem conflitos em potencial, ou seja, somente 6 pinos estão completamente livres para fazer PWM, se não for a UART2, caso contrário só restam 4 pinos de PWM livres.
Saída PWM | pino padrão | pino alternativo |
ECAPPWM0 | P9_42 (provável conflito) | |
ECAPPWM2 | P9_28 (LCD) | |
EHRPWM0A | P9_31 (LCD) | P9_22 / USART2_RXD |
EHRPWM0B | P9_21 / USART2_TXD | P9_29 (LCD) |
EHRPWM1A | P9_14 | P8_36 (sys_boot / LCD) |
EHRPWM1B | P9_16 | P8_34 (sys_boot / LCD) |
EHRPWM2A | P8_19 | P8_45 (sys_boot / LCD) |
EHRPWM2B | P8_13 | P8_46 (sys_boot / LCD) |
Também é importante olhar o esquemático elétrico da placa, pois alguns pinos compartilhados podem causar problemas no futuro.
https://github.com/CircuitCo/BeagleBone-Black/blob/master/BBB_SCH.pdf?raw=true
Os pinos 31 a 46 do P8 configuração o processador na hora do boot.
Portanto para evitar problemas não conecte pull-up/down e nem tente usar como entrada, o jeito mais seguro é usar esses 16 pinos como saídas e se possível adiciona proteção contra entrada (por exemplo usando diodos de sinal 1n4148).
Os pinos 27,28,29,30 do P8 também estão em uso pelo LCD / HDMI.
Pinout da beaglebone black com todos conflitos comentados |
A situação do P8 é bem confortável após remover os conflitos.
HEADER | GPIO (3.3V) | TIMER | PWM | |
1 | P8_7 | GPIO2_2 | TIMER4 | |
2 | P8_8 | GPIO2_3 | TIMER7 | |
3 | P8_9 | GPIO2_5 | TIMER5 | |
4 | P8_10 | GPIO2_4 | TIMER6 | |
5 | P8_11 | GPIO1_13 | ||
6 | P8_12 | GPIO1_12 | ||
7 | P8_13 | GPIO0_23 | EHRPWM2B | |
8 | P8_14 | GPIO0_26 | ||
9 | P8_15 | GPIO1_15 | ||
10 | P8_16 | GPIO1_14 | ||
11 | P8_17 | GPIO0_27 | ||
12 | P8_18 | GPIO2_1 | ||
13 | P8_19 | GPIO0_22 | EHRPWM2A | |
14 | P8_26 | GPIO1_29 |
A situação do P9 é mais complicada, após remover os conflitos a multiplexação de funcionalidades nos pinos não permite usar todas as funcionalidades ao mesmo tempo.
Ativar a interface SPI0 implica em perder a UART2 e 2 PWMs e remanejar o I2C1 e I2C2.
Ativar a interface DCAN1 implica em perder a UART1.
Ativar a interface DCAN0 implica em remanejar o I2C2.
Ativar a interface UART1 implica em perder o DCAN1 e remanejar o I2C1.
Ativar a interface UART2 implica em perder o SPI0 e 2 PWMs e remanejar o I2C2.
HEADER | GPIO (3.3V) | TIMER | PWM | I2C | UART | SPI | CAN | |
1 | P9_11 | GPIO0_30 | UART4_RXD | |||||
2 | P9_12 | GPIO1_28 | ||||||
3 | P9_13 | GPIO0_31 | UART4_TXD | |||||
4 | P9_14 | GPIO1_18 | EHRPWM1A | |||||
5 | P9_16 | GPIO1_19 | EHRPWM1B | |||||
6 | P9_17 | GPIO0_5 | I2C1_SCL | SPI0_CS0 | ||||
7 | P9_18 | GPIO0_4 | I2C1_SDA | SPI0_D1 | ||||
8 | P9_19 | GPIO0_13 | TIMER5 | I2C2_SCL | SPI1_CS1 | DCAN0_RX | ||
9 | P9_20 | GPIO0_12 | TIMER6 | I2C2_SDA | SPI1_CS0 | DCAN0_TX | ||
10 | P9_21 | GPIO0_3 | EHRPWM0B | I2C2_SCL | UART2_TXD | SPI0_D0 | ||
11 | P9_22 | GPIO0_2 | EHRPWM0A | I2C2_SDA | UART2_RXD | SPI0_SCLK | ||
12 | P9_23 | GPIO1_17 | ||||||
13 | P9_24 | GPIO0_15 | I2C1_SCL | UART1_TXD | DCAN1_RX | |||
14 | P9_26 | GPIO0_14 | I2C1_SDA | UART1_RXD | DCAN1_TX | |||
15 | P9_27 | GPIO3_19 | ||||||
16 | P9_30 | GPIO3_16 |
A parte analógica do P9 não tem conflitos, mas só aceita tensão até 1,8V.
HEADER | ANALOG (1.8V) | |
1 | P9_33 | A4 |
2 | P9_35 | A6 |
3 | P9_36 | A5 |
4 | P9_37 | A2 |
5 | P9_38 | A3 |
6 | P9_39 | A0 |
7 | P9_40 | A1 |
Os ESC dos motores aceita frequências de 50Hz a 490Hz.
A rotação mínima é obtida com pulsos de 1ms.
A rotação máxima é obtida com pulsos de 2ms.
Calcular o ‘duty cycle’ para os motores
http://www.optical-calculation.com/calculations/duty_cycle_of_a_pulsed_laser.php
Os pinos de PWM são:
ECAPPWM0 - P9_42
ECAPPWM2 - P9_28
EHRPWM0A - P9_22 P9_31
EHRPWM0B - P9_21 P9_29
EHRPWM1A - P9_14 P8_36
EHRPWM1B - P9_16 P8_34
EHRPWM2A - P8_19 P8_45
EHRPWM2B - P8_13 P8_46
Por algum motivo ainda em debug, os PWMs não funcionam como esperado.
E os motores continuaram a beepar sem entrar no modo armado.
BeagleBone Black tentando armar os motores do Quadcopter. Mas somente 2 motores armaram corretamente. |
root@beaglebone:/etc# cat /etc/version
Angstrom v2012.12
Talvez seja necessário atualizar a imagem do Linux instalada na BBB.
http://beagleboard.org/latest-images
Estão disponíveis 4 images de cartão SD para atualizar a BBB.
Duas rodam direto do SD.
http://debian.beagleboard.org/images/bone-debian-7.5-2014-05-14-2gb.img.xz
https://s3.amazonaws.com/angstrom/demo/beaglebone/Angstrom-Cloud9-IDE-GNOME-eglibc-ipk-v2012.12-beaglebone-2013.06.20.img.xz
E duas se copiam para rodar dentro do EMMC.
http://debian.beagleboard.org/images/BBB-eMMC-flasher-debian-7.5-2014-05-14-2gb.img.xz
https://s3.amazonaws.com/angstrom/demo/beaglebone/BBB-eMMC-flasher-2013.09.04.img.xz
Todas as beaglebones novas passaram a usar o Debian como imagem padrão desde de maio de 2014.
Um das novidades do Debian é o "Userspace Arduino libraries", que transforma BBB em Arduino.
http://elinux.org/Userspace_Arduino#new_Debian_images
Depois de instalar o Debian 7.5 no EMMC da BBB, é preciso rotear o acesso da placa pelo USB.
No Linux isso é feito com apenas dois comandos:
root@beaglebone:~# sysctl -w net.ipv4.ip_forward=1
root@beaglebone:~# iptables -t nat -A POSTROUTING -j MASQUERADE
E no lado da BBB, tudo deveria estar ok, mas a rota para padrão e o dns não vem configurados.
root@beaglebone:~# route add default gw 192.168.7.1
root@beaglebone:~# echo nameserver 8.8.8.8 > /etc/resolv.conf
Agora que a internet está funcionando na BBB, é preciso atualizar o Debian.
root@beaglebone:~# aptitude update
root@beaglebone:~# aptitude dist-upgrade
Editar ambiente do uBoot para desativar a interface HDMI e liberar alguns pinos.
root@beaglebone:~# nano /boot/uboot/uEnv.txt
##Disable HDMI
cape_disable=capemgr.disable_partno=BB-BONELT-HDMI,BB-BONELT-HDMIN
root@beaglebone:~# aptitude install ipython mc python-serial
Instalação do Adafruit BeagleBone IO Python library
https://learn.adafruit.com/setting-up-io-python-library-on-beaglebone-black/installation-on-ubuntu
root@beaglebone:~# apt-get install build-essential python-dev python-setuptools python-pip python-smbus -y
root@beaglebone:~# pip install Adafruit_BBIO --upgrade
Testando o ADC com ipython
Testando com todos os pinos no AGND, depois no VREF_ANALOG, e por fim aberto. O resultado é um percentual, para descobrir a tensão real é preciso multiplicar por 1.8V |
Ligações de todos os pinos do ADC juntos. |
https://github.com/tgvaughan/PirateScope
PirateScope capturando PWM de 50Hz (20ms) com duty-cycle 50% (10ms) |
Buspirate conectado: GND -> BBB: GND ADC -> BBB: P9_14 |
root@beaglebone:~# ipython
Python 2.7.3 (default, Mar 14 2014, 17:55:54)
Type "copyright", "credits" or "license" for more information.
IPython 0.13.1 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
In [1]: import Ada
Adafruit_BBIO Adafruit_I2C
In [1]: import Adafruit_BBIO.
Adafruit_BBIO.ADC Adafruit_BBIO.PWM Adafruit_BBIO.UART
Adafruit_BBIO.GPIO Adafruit_BBIO.SPI
In [1]: import Adafruit_BBIO.PWM as PWM
In [2]: PWM.start("P9_14",50,50)
In [3]:
P8_13
P8_19
P8_34
P8_36
P8_45
P8_46
P9_14
P9_16
P9_21
P9_22
P9_28
P9_29
P9_31
P9_42