разработка и программирование электронных устройств

Обзор одноплатного компьютера Beaglebone Black.

Не так давно (в 2011 году) прогремела на весь мир реклама самого дешевого в мире компьютера (35$) Raspberry PI, который позиционировался как средство для обучения школьников и студентов.

Кроме Raspberry PI существует достаточно большое количество аналогичных по возможностям одноплатных компьютеров на базе процессорных ядер ARM.
Общим для всех этих устройств является наличие интерфейсов USB Host, USB Device, Ethernet, HDMI, поддержка карт памяти формата SD или microSD.

В качестве операционной системы используется Linux или Android.
Возможности таких компьютеров достаточно ограничены, но для набора текста и поиска информации в сети интернет их производительности вполне достаточно.
Наличие портов USB обеспечивает подключения клавиатуры и мыши, HDMI выход позволяет подключать к одноплатному компьютеру телевизор или монитор через переходник HDMI-DVI.

Плата BeagleBone Black также имеет все выше перечисленные возможности.
Процессор от компании Texas Instruments серии Sitara AM3359AZCZ100 с тактовой частотой в 1ГГц содержит в своем составе вычислительное ядро Cortex-A8 и графический ускоритель SGX530 . На плате установлено 512 Мб оперативной памяти DDR3L , Flash память eMMC объемом в 2 ГБ , на которой установлена операционная система Angstrom Linux.
Для загрузки другого дистрибутива Linux или ОС Android можно использовать карту памяти формата microSD , подключаемую к соответствующему слоту на плате.
Также можно установить новую операционную систему на запаянную в плату память eMMC, но если новый образ не будет работать, то загрузиться в Angstrom Linux уже не получиться, поскольку он будет затерт.

Внешний вид и расположение основных элементов BeagleBone Black показаны на следующих рисунках.

  • 1 – разъем miniUSB
  • 2 – разъем microHDMI
  • 3 – держатель карты памяти формата microSD

  • 1 – 512Мб оперативной памяти DDR3
  • 2 – контроллер HDMI
  • 3 – процессор Sitara Am3359
  • 4 – микросхема электропитания
  • 5 – контроллер физического уровня Ethernet
  • 6 – микросхема FLASH памяти eMMC
  • 7 – разъем USB-A
  • 8,11 – разъемы расширения портов GPIO
  • 9 – разъем для подключения внешнего источника питания 5В 2А
  • 10 – Ethernet разъем

В youtube выложен видеоролик , в котором сравнивается скорость загрузки графической оболочки X-Window в Raspberry PI и BeagleBone Black. Из ролика видно, что последняя имеет большую производительность по сравнению с первой. Однако в Raspberry PI реализована аппаратная поддержка кодеков MPEG4 и MPEG2, что позволяет создать на ее основе медиацентр.

Поскольку мне удалось «пощупать» только плату Beaglebone Black , то на этом пожалуй все сравнения с другими одноплатными компьютерами закончатся.

Для платы beaglebone black (как и для Raspberry PI) в сети интернет можно найти просто огромное количество готовых проектов, разработанных интузиастами. Среди таких проектов есть и термометр с отображением графика температуры через web -интерфейс, программатор CPLD и FPGA Xilinx , банальное моргание светодиодом и много других , различных по сложности, проектов.

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

Из недостатков (с моей точки зрения) Beaglebone Black отмечу наличие на плате миниатюрного разъема microHDMI вместо полноразмерного HDMI . Кабель для подключения к разъему microHDMI найти не так легко , как стандартный HDMI. Вторым недостатком является наличие всего одного разъема USB Host , для подключения мышки и клавиатуры придется подключить к плате аппаратный USB Hub.

Впрочем для своих экспериментов я не использовал ни устройство вывода, ни клавиатуры с мышкой.

Для питания платы используется внешний источник 5В 2А. Большое потребление обусловлено работой видео подсистемы. Если вы не собираетесь подключать к плате монитор или телевизор, то для питания и обмена данными подойдет стандартный кабель miniUSB.

Итак, подключаем плату к компьютеру с помощью стандартного кабеля USBA – miniUSBB.
В системе появиться новый съемный диск. Открываем в проводнике содержимое съемного носителя. Дальше запускаем в web -браузере страницу START.htm.

Первым делом необходимо установить драйвера для используемой вами host- системы , будь то Windows/ Linux/ MacOS , 32 или 64 битная система, драйвера есть в наличии. Установка драйвера позволит использовать доступ к компьютерной сети через интерфейс USB, Ethernet порт можно даже и не подключать.

На плате запущен встроенный web – сервер.
После установки драйверов откройте в web – браузере страничку, набрав в адресной строке
IP – адрес платы по-умолчанию 192.168.7.2.

Для интереса можете просмотреть предлагаемые возможности по управлению платой BeagleBone Black. В основном это различные скриптовые языки, с помощью которых можно управлять портами GPIO платы. Есть браузерная IDE для написания управляющих скриптов.
Но все это больше подходит для баловства, меня же в первую очередь интересовало написание программ для платы на языках программирования C и C++.

Традиционно первой программой для ПК при изучении нового языка программирования является “Hello, World!” . Для микроконтроллерных устройств первая программа традиционно моргает светодиодом.

В случае BeagleBone Black вы можете выбрать любой из указанных вариантов для написания первой программы.

Кроме того в предустановленной системе Angstrom Linux уже установлен компилятор gcc для целевой платформы, поэтому программы можно писать и компилировать прямо на плате.
Устанавливаем соединение с платой по протоколу SSH (Secure Shell) .
При использовании в качестве Host – системы одного из дистрибутивов Linux просто запустите терминал и в командной строке введите :

ssh root@192.168.7.2
root@192.168.7.2's password:

На предложение ввести пароль просто нажмите ввод.
Если вы используете операционную систему Windows , то запустите командный интерпретатор Command Prompt и выполните аналогичные действия в командной строке Windows:

ssh root@192.168.7.2
root@192.168.7.2's password:

В итоге плата покажет в командной строке приглашение :

root@beaglebone:~#

Создадим простую программу , набрав ее текст во встроенном текстовом редакторе :

root@beaglebone:~#vi hello.c

Включаем режим редактирования нажатием на клавишу “I” (Insert) и вводим следующий текст :

1
2
3
4
5
6
7
#include <stdio.h>
 
int main()
{
     printf("Hello, BeagleBone Black!\n");
     return 0;
}

Сохраняем файл и выходим нажатием последовательно на клавиши ESC : x .

Компилируем и компонуем программу :

root@beaglebone:~#gcc hello.c -o hello

Запускаем новоиспеченную программу :

root@beaglebone:~#./hello
Hello, BeagleBone Black!

Настало время поморгать светодиодом, которых на плате четыре (программно управляемых).
Разработчики, использующие в своих проектах микроконтроллеры без встроенной ОС или с специализированной RTOS привыкли к тому, что доступ к аппаратным модулям контроллера открыт в любой части программы.

В Linux, как известно, пространство памяти пользователя и ядра разделены. Для доступа к аппаратным ресурсам используются соответствующие программные драйвера, являющиеся модулями ядра, то есть использующие пространство памяти ядра Linux.
Одним из способов написать простую программу для платы BeagleBone Black , которая будет управлять светодиодом , является использование виртуальной файловой системы.

Для начала рассмотрим имеющиеся на плате светодиоды :

  • USR0 – первый (или если хотите — нулевой) пользовательский светодиод используется для сигнализации работы операционной системы, если моргает, значит что-то работает, не все так плохо
  • USR1 – второй светодиод задействован для индикации доступа к карте памяти microSD
  • USR2 – третий светодиод используется для индикации активности CPU
  • USR3 – четвертый светодиод сигнализирует о доступе к памяти eMMC

Для того, чтобы иметь возможность управлять одним или всеми пользовательскими светодиодами необходимо отключить функцию, назначенную каждому светодиоду по-умолчанию.

Для этого откроем файл настроек светодиодов /etc/default/leds и отредактируем его следующим образом :

#file format: name trigger
#beaglebone::usr0 heartbeat
beaglebone:green:usr0 none
beaglebone:green:usr1 none
beaglebone:green:usr2 none
beaglebone:green:usr3 none

После внесения изменений нужно перезагрузить плату, для этого выполним команду :

root@beaglebone:~#reboot

Соединение по SSH после перезагрузки необходимо будет запустить заново .
Теперь светодиоды USR0 – USR3 будут погашены.
Управлять ими можно как из исходного кода программы, так и с командной строки :

root@beaglebone:~#cd /sys/class/leds
root@beaglebone:/sys/class/leds~#ls
beaglebone:green:usr0  beaglebone:green:usr2
beaglebone:green:usr1  beaglebone:green:usr3

Экспериментировать будем с светодиодом usr0 :

root@beaglebone:/sys/class/leds#cd beaglebone:green:usr0
root@beaglebone:/sys/class/leds/beaglebone:green:usr0#ls
brightness  device  max_brightness  power  subsystem  trigger  uevent

Зажечь светодиод можно следующей командой :

root@beaglebone:/sys/class/leds/beaglebone:green:usr0#echo 1 > brightness

Погасить его можно соответственно перенаправив вывод ноля в brightness :

root@beaglebone:/sys/class/leds/beaglebone:green:usr0#echo 0 > brightness

Заставить моргать светодиод с периодом в 400 мсек можно при помощи такой команды :

root@beaglebone:/sys/class/leds/beaglebone:green:usr0#echo timer > trigger
root@beaglebone:/sys/class/leds/beaglebone:green:usr0#echo 200 > delay_on
root@beaglebone:/sys/class/leds/beaglebone:green:usr0#echo 200 > delay_off

Точно таким же образом можно управлять светодиодами из программы на языке С. Недостатком такого решения является небольшая скорость переключения выводов.

В следующей короткой программе на языке С мы заставим светодиод usr0 моргать :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/* led_flash.c */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define USR0_PATH   "/sys/class/leds/beaglebone:green:usr0"
 
int main( int argc, char * argv[] )
{
    FILE * fp;
    if ( argc != 2 ) {
        printf("wrong number of arguments\n");
        return EXIT_FAILURE;
    }
    fp = fopen( USR0_PATH"/trigger", "w");
    if ( fp == NULL ) {
        printf("can not open file\n");
        return EXIT_FAILURE;
    }
    if ( strcmp( (const char *) argv[1], "off") == 0 ) {
        fprintf( fp, "none");
    }
    else if ( strcmp( (const char *) argv[1], "on") == 0 ) {
        fprintf( fp, "timer");
    }
    else {
        printf("unknown argument\n");
        fclose( fp );
        return EXIT_FAILURE;
    }
    fclose( fp );
    return EXIT_SUCCESS;
}

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

gcc led_flash.c -o led_flash
./led_flash on
./led_flash off

Вот собственно и все, для короткого обзора данной информации будет вполне достаточно. В следующей публикации мы рассмотрим управление портами GPIO с использованием системных вызовов open() и mmap().

Leave a Reply

You must be logged in to post a comment.