Thursday, June 26, 2014

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:
http://192.168.7.2:3000/

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 PWMpino padrãopino alternativo
ECAPPWM0P9_42 (provável conflito)
ECAPPWM2P9_28 (LCD)
EHRPWM0AP9_31 (LCD)P9_22 / USART2_RXD
EHRPWM0BP9_21 / USART2_TXDP9_29 (LCD)
EHRPWM1AP9_14P8_36 (sys_boot / LCD)
EHRPWM1BP9_16P8_34 (sys_boot / LCD)
EHRPWM2AP8_19P8_45 (sys_boot / LCD)
EHRPWM2BP8_13P8_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.

HEADERGPIO (3.3V)TIMERPWM
1P8_7GPIO2_2TIMER4
2P8_8GPIO2_3TIMER7
3P8_9GPIO2_5TIMER5
4P8_10GPIO2_4TIMER6
5P8_11GPIO1_13
6P8_12GPIO1_12
7P8_13GPIO0_23EHRPWM2B
8P8_14GPIO0_26
9P8_15GPIO1_15
10P8_16GPIO1_14
11P8_17GPIO0_27
12P8_18GPIO2_1
13P8_19GPIO0_22EHRPWM2A
14P8_26GPIO1_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.

HEADERGPIO (3.3V)TIMERPWMI2CUARTSPICAN
1P9_11GPIO0_30UART4_RXD
2P9_12GPIO1_28
3P9_13GPIO0_31UART4_TXD
4P9_14GPIO1_18EHRPWM1A
5P9_16GPIO1_19EHRPWM1B
6P9_17GPIO0_5I2C1_SCLSPI0_CS0
7P9_18GPIO0_4I2C1_SDASPI0_D1
8P9_19GPIO0_13TIMER5I2C2_SCLSPI1_CS1DCAN0_RX
9P9_20GPIO0_12TIMER6I2C2_SDASPI1_CS0DCAN0_TX
10P9_21GPIO0_3EHRPWM0BI2C2_SCLUART2_TXDSPI0_D0
11P9_22GPIO0_2EHRPWM0AI2C2_SDAUART2_RXDSPI0_SCLK
12P9_23GPIO1_17
13P9_24GPIO0_15I2C1_SCLUART1_TXDDCAN1_RX
14P9_26GPIO0_14I2C1_SDAUART1_RXDDCAN1_TX
15P9_27GPIO3_19
16P9_30GPIO3_16


A parte analógica do P9 não tem conflitos, mas só aceita tensão até 1,8V.

HEADERANALOG (1.8V)
1P9_33A4
2P9_35A6
3P9_36A5
4P9_37A2
5P9_38A3
6P9_39A0
7P9_40A1

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

Para 50Hz um pulso de 1ms é equivalente a 5% => 0.05 no formato da analogWrite
Para 50Hz um pulso de 2ms é equivalente a 10% => 0.1 no formato da analogWrite

Para 490Hz um pulso de 1ms é equivalente a 49% => 0.49 no formato da analogWrite
Para 490Hz um pulso de 2ms é equivalente a 98% => 0.98 no formato da analogWrite

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.



A minha BBB veio com um imagem antiga.
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

Instalar alguma pacotes adicionais
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.
Instalar o PirateScope, é preciso de um osciloscópio para testar o PWM.
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
Testando o PWM pelo ipython
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