Hello world для Cubieboard2

Download a Free Game!

2014-04-01 15.46.26

Рассмотрим как быстро и просто задействовать GPIO на Cubie. Рассмотрим для начала ручное мигание светодиодиком, а потом уже и собственно напишем программу.
И так.
Хочу заметить, что мы так и остаемся на прошитом Android.

Описывать как подключить к монитору и воткнуть в USB мышку я рассказывать не буду.
Первым делом Вам надо будет скачать из Google Play или с любого другого ресурса Terminal Emulator
Для этой программы, есть Wiki, на случай вопросов. Вообще команды в андройде как и в линуксе. Так что знакомым будет просто. А для таких же как и я буду все рассматривать подробно.
Запускаем эту программу и пишем в ней первым делом

su

Это необходимо для переключения пользователя SwitchUser. После этого у вас место знака $ появится # перед курсором. Это значит что вы имеете права root пользователя.

По умолчанию прошивка собрана с этими правами, так что должно все работать, но если у вас нет root прав, то придется менять прошивку.

Далее пишем

# echo 214 > /sys/class/gpio/export
# ls /sys/class/gpio/
export 
gpio214
...
unexport

Первая команда задействует порт под номером 214, это порт PI13 находится он в левом верхнем углу (самый крайний порт). Следующей командой мы проверяем его наличие.

Названия портов Cubieboard2

Через 2 порта вниз GND. Собственно эти 2 порта нам и понадобятся сейчас.

Ваша задача подключить длинную ножку светодиода к порту PI13, а короткую через резистор номиналом около 330 Ом к порту GND.

Теперь рассмотрим саму суть этого и любого другого порта. Каждый порт может быть настроен как вход или как выход. По умолчанию все порты являются входами (такая настройка предотвращает случайное сжигание порта). Чтобы изменить направление порта на выход нужно написать команду

# echo out > /sys/class/gpio/gpio214/direction

соответственно, чтобы сделать порт входом надо заменить OUT на IN. Далее мы можем узнать состояние порта

# cat /sys/class/gpio/gpio214/value 
0

и изменить состояние порта

# echo 1 > /sys/class/gpio/gpio214/value 
1

Теперь записывая в порт 0 или 1 вы можете переключать светодиод подключенный на этот порт. При value == 0 через светодиод не течет ток, а при value == 1 через светодиод течет ток. Этот ток пропорционален  сопротивлению стоящему последовательно со светодиодом. Так что будьте внимательны! Если поставить слишком маленькое сопротивление, то можно сжечь порт, а если слишком большое то светодиоду может не хватить для эмиссии.

Далее некоторые полезные ссылки

Cubian wiki GPIO-Introduction Оригинал на английском.

habrahabr.ru Общая информация о плате

habrahabr.ru Сервер на такой плате

we.easyelectronics.ru еще один обзор с подключением через putty

likeaferrari.wordpress.com похожая статья на английском

How to access GPIO pins on a Cubieboard 2 инструкция от разработчиков платы

Начало. Стабилизированная платформа (из MultiWii 328P + HXT-900)

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

2013-09-26 19.28.34

И так что такое MultiWii и что мы будем делать?

MultiWii 328P представляет собой контроллер мультикоптера с базовой инерциально-навигационной системой, который может быть запрограммирован соответственно вашим требованиям. Эта версия MultiWii контроллера имеет поддержку сателитных приемников DSM2*. С расширенными возможностями и возможностью полного программирования, это устройство может контролировать любой тип самолета. Это идеальный контроллер полета для ваших многороторных авиамоделей.

Вот, так пишут продавцы.

К плате написан прекрасный софт для настройки отладки и проверки всех его возможностей, взглнем на него.

Без имени-1

Подключив плату через USB надо не забыть поставить дрова на FTDI, хотя скорее они поставятся сами. Все что есть в проге делится на несколько разделов, кароче не паримся и жмакаем коннект (прога сама определит на каком COM порте сидит устройство). Самое веселое это закладка Realtime Data, после подключения в этой закладке отображаются значения всех датчиков которые стоят на плате и значения сервомашинок.

Вращая платку видно что показания меняются, это двольно таки весело, уже придумал много способов применения (вплоть до 3D очков с эффектом присутствия)

Конечно хотелось бы поюзать все его возможности, но начинать надо с малого.

Сейчас ставлю перед собой задачу сделать просто стабилизированную платформу, чтобы в будущем на нее поставить веб-камеру например.

Что нам нужно для этого?

  • 2 сервопривода (чем дорожже тем точнее будет держать, вообще то надо бы для съемки использовать качественные, но я беру какая есть) – от 60 рублей/шт
  • 1 плата multiwii 328p – от 800 рублей/шт
  • для конечной конструкции еще надо будет всяких уголков как из детского конструктора

Софт

  • все написано под ардуино так что качаем его
  • готовый проект на ардуино от производителя платы
  • GUI для платы

Что делать?

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

Открываем arduino, запускаем скачанный проект (MultiWii_2_1.ino), в открывшемся проекте открываем закладку config.h и в ней меняем несколько строк,надо снять коменты:

//#define CRIUS_SE // Crius MultiWii SE

самое главное, это выбрать устройство которое вы юзаете (это новая прошивка не та что была уже залита, так что вот)

/**************************    The type of multicopter    ****************************/
    #define GIMBAL
/************************************************************************************/

вот с такой строки – это разрешение использовать порты под дополнительные сервомашинки.

***********************          Cam Stabilisation             ***********************/
    /* The following lines apply only for a pitch/roll tilt stabilization system. Uncomment the first or second line to activate it */
    //#define SERVO_MIX_TILT
    #define SERVO_TILT
    #define TILT_PITCH_MIN    1020    //servo travel min, don't set it below 1020
    #define TILT_PITCH_MAX    2000    //servo travel max, max value=2000
    #define TILT_PITCH_MIDDLE 1500    //servo neutral value
    #define TILT_PITCH_PROP   14     //servo proportional (tied to angle)           
    #define TILT_ROLL_MIN     1020
    #define TILT_ROLL_MAX     2000
    #define TILT_ROLL_MIDDLE  1500
    #define TILT_ROLL_PROP    14

со строки #define SERVO_TILT и значения  TILT_PITCH_PROP, TILT_ROLL_PROP пригодятся для подстройки под каши серваки.

В закладке Output:

#ifdef GIMBAL
    servo[0] = constrain(TILT_PITCH_MIDDLE + TILT_PITCH_PROP * angle[PITCH] /6 + rcCommand[PITCH], TILT_PITCH_MIN, TILT_PITCH_MAX);
    servo[1] = constrain(TILT_ROLL_MIDDLE + TILT_ROLL_PROP   * angle[ROLL]  /6 + rcCommand[ROLL], TILT_ROLL_MIN, TILT_ROLL_MAX);

тут есть число 16 меняем на примерно 6, можно будет с ним поиграть потом тоже.

Еще в разделе Servo Refreshrates, можно задать частоту обновления сервоприводов, для аналоговых она 50 Гц, а вот цифровые могут и почаще.

Итак, все с конфигом, теперь надо сохранить проект, и залить его на контроллер, делается это так:

  1. Сервис -> Последовательный порт -> COM8 (у меня)
  2. Сервис -> Плата -> Arduino Nano /w ATmega 328

Далее жмем кнопку  загрузить, он компилирует проект и заливает его на плату. Теперь остается подключить к плате сервопривод на ногу A0 и A1 и отстроить значения для конкретной сервомашинки. (Не забывайте что Земля-Коричневый провод)

Еще полезные ссылки:

http://www.ixbt.com/digimage/gyro2.shtml - Применение для машины

http://www.rcgroups.com/forums/showthread.php?t=1710318 - Исходник

PS: Нашел интересный вариант GUI - https://play.google.com/store/apps/details?id=com.ezio.multiwii

 

Гитарные импульсы: Введение

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

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

ZOOM MS-100BT

Прежде всего, надо прикинуть какая вычислительная мощность нужна для этого всего дела. И так, зная что ухо у нас выше 20 кГц не слышит можно смело поставить верхний предел по частоте дискретизации, но все же хотелось бы еще и планку минимум найти. В  это статье показаны частотки для различных жанров музыки. В общем, поверим на слово,  что тяжелая музыка выше 3 кГц не поднимается. Известный закон для граничной частоты для оцифровки и  получаем диапазон (6 кГц – 40 кГц) частот дискретизации.

Теперь с разрешением, тут все просто, чем больше тем лучше, но и тем дороже, значит будем балансировать и тестировать. Вообще конечно принятое оптимальное разрешение 24 Бита.

Для примера приведу ZOOM, Известные процессорные педальки. Как раз подвернулась интересная их новинка, посмотрим на ее характеристики.

  • Частота дискретизации – 44.1 кГц
  • Разрешение – 24 Бита
  • Процессор 32 битный
  • Входное сопротивление – 1 МОм
  • Выходное сопротивление – 10 кОм

При цене в 150$ ( 4500 р )

Далее будем думать как это сделать все самим и уложиться в стоимость этой педальки, смотрим что нам предлагают AVR и ST.

Из AVR я выбрал ATxmega128A1 и сразу же заказал отладочную плату READY for XMEGA (1400р). C 32 MHz частотой и преобразователем на 2 МВыборок/сек. Самым большим минусом тут будет 8 битный процессор, что значит перемножение чисел не пройдет в 1 такт.

Для 6 кГц выборки количество свободных тактов на вычисление будет около 5к. И если брать импульсную характеристику с такой же выборкой, то максимальная ее длинна может быть 5/6 секунды (накачав импульсов с этой стати прикинул, что больше 1 сек импульсов не бывает практически, так что все ОК)

Теперь посмотрим на STM. В этих контроллерах я вообще не шарю (вот и разберусь по ходу), Оптимальным решением для меня стала плата STM32 DISCOVERY (800р) т.к. она имеет ЦАП/АЦП (12 бит, у xmega такой же) частота конечно не особо большая, но зато гарантированное выполнение умножения за 1 такт. Да и программатор с выводами на борту порадовал.

Опять же прикинем для 6 кГц выборки остается 4к пустых тактов, а значит длинна импульсы может быть до 0.6 секунд.

Шаг 2 заключается в построении модели этого устройства.

http://forum.guitarplayer.ru/index.php?topic=147691.0

http://www.audioplace.ru/chastotnye-kharakteristiki-muzykalnykh-stilejj.html

http://www.mikroe.com/ready/xmega/

http://we.easyelectronics.ru/STM32/prostoy-start-stm32coocox-idest-link.html

http://www.muzoborudovanie.ru/equip/studio/comm/comm/comm1.php

http://www.zoom.co.jp/products/ms-100bt

Как связать ПК с контроллером ATmega

Ранее я делал схему для связи любого ПК с МК. Теперь рассмотрим как все это выглядит со стороны контроллера и со стороны ПК.

Сторона контроллера

2013-03-29 22.36.32

Для контроллера это простой UART. Когда компьютер посылает какие-либо данные контроллер вызывает прерывание и дальше мы обрабатываемым эти данные. Для этого лучше написать 2 простые функции.

void USART_Init(){
	//UCSRA=(1<<U2X);
	UCSR0B=(1<<RXCIE0)|(1<<RXEN0)|(1<<TXEN0)|(1<<TXB80)|(1<<RXB80);
	//UCSRC=(1<<UCPOL);
	UBRR0H=0;//
	UBRR0L=1;//bound
	//TXD/PD1 - Output
	DDRD |= (1<<PD1);
}
void transmitUART(unsigned char data_){
	while( !(UCSR0A&(1<<UDRE0)) );
	UDR0 = data_;
}

И все остальное можно обрабатывать в прерывании примерно так

ISR(USART_RX_vect){
	transmitUART(UDR0);
	switch(usartBuffer){
		case 0x31:
			if(n==0){
				PORTB |= (1<<PB1);
				PORTB &= ~(1<<PB2);
				n=1;
			}else{
				PORTB |= (1<<PB2);
				PORTB &= ~(1<<PB1);
				n=0;
			}
		break;
		default:
			// DEFAULT OP
		break;
	}
}

Что-бы общение было хоть как-то осмысленным принимаем что первый принятый байт посылки - команда, а дальше действуем по желаемой модели. Например команда 0×31 ( ASCII = 1 ) будет переключать светодиоды на контроллере.

Вот и все, теперь можно переходить к ПО для ПК.

Сторона ПК

Снимок3

Тут я выбираю, наверное, самое простое решение. Опен соурс SharpDevelop, очень удобен и все необходимое включено, при том без танцев с бубном.

И так, C# это совсем не тоже самое что С/С++, но все же Си.

Нам нужна будет библиотека работающая с периферией, называется она так

using System.IO.Ports;

Дальше создается экземпляр класса, настраиваем его и можно отправлять посылки.

public static SerialPort serialPort1 = new SerialPort();
serialPort1.PortName = "COM4"; //Указываем наш порт
serialPort1.BaudRate = 256000;//9600; //указываем скорость.
serialPort1.DataBits = 8; 
serialPort1.Open(); //Открываем порт.

//Событие вызовется когда получены данные
serialPort1.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler_);

//Посылаем контроллеру информацию
serialPort1.WriteLine("1");//0x31

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

 

PS: Подытожу. На ПК запускается приложение в котором описана логика взаимодействия пользователя с периферийным устройством, это приложение посылает/принимает информацию от устройства.

Печатная плата своими руками

Расскажу о моем первом опыте изготовления плат по ЛУТ. Вот наиболее подробная инструкция.

2013-03-29 22.36.32

И так, необходимость возникла только потому что злобная компания FTDI не хочет делать переходник USB<->USRT в корпусе DIP. А забивать память МК библиотекой на USB не хочется.

Все делал прямо по инструкции:

0. Закупил все что нужно

2013-03-28 19.50.29

 

  1. Хлористое железо
  2. Припой ножик канцелярский
  3. Провод
  4. Ванночка для травления
  5. Шкурка (самая мелкая)
  6. Глицерин ( в аптеке 7р)
  7. Однослойный текстолит
  8. Электрические компоненты

1. Нарисовал плату, распечатал на лазерном принтере

2013-03-28 19.59.43

 

Не забудьте инвертировать плату по одной оси до распечатки. Руками не трогать, только за края. Фольгу прошкурить.

2. Отутюжил, смыл

2013-03-28 20.32.46

 

Не зря сделал сразу 10 шт, так и знал что что-то может пойти не так. Либо плохо прогладил либо пальцем ляпнул не знаю, но -2 штуки сверху. Глянец в некоторых местах сходит очень тяжело, но он не влияет на травление.

 

3. Вытравил и выпилил

2013-03-28 21.47.40 2013-03-29 10.40.40

 

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

Дальше все это дело покрывается глицерином ( его не жалеть ) и лудится. Во время пайки лучше сначала позиционировать компонент, потом прижать его зубочисткой и ненадолго приложить жало к месту контакта.

Самое мучение с многоконтактными элементами (FT232). Сначала припаиваем 1 ногу крайнюю, потом, если другие ногу немного не совпадают, поворачиваем вокруг нее и припаиваем противоположную дальше сами знаете.

 

4. Залудил припаял контрольный диод, а потом и все остальное

2013-03-29 21.34.48

 

 

Вот видео как работает FT. С ПК посылаю команду на переключение светодиодов.

 

Прошивка совместимая с AVRStudio

Немного неудобно, когда пишешь код в одной программе а заливаешь его через другую. По этому случаю, совершенно случайно, нашел прошивку под схему PROTTOSS`а совместимую со студией.

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

 

Как дойдут руки перепрошить, выложу результаты.

 

Для общего развития картинка Фрактала ( Множество Мандельброта )

PS: Фрактал – это не просто красотулечька, при их помощи сжимают информацию, убирают шумы и еще много интересного. 

640px-Mandelpart2

Фотоаппарат своими руками

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

Неожиданно, но поиски того как сделать фотоаппарат самому привели меня к этой статье. В изготовлении я решил начать с освоения получения изображения. Так вот, умные люди говорят, что на атмегу нормальную матрицу не приделать. Но ничего, это мы еще посмотрим. А пока, вернемся к самому простому и что можно посадить на мегу, это оптический сенсор в любой мышке.

Как только, об этом узнал, принялся сразу разбирать все мышки в доме, но не все имеют сенсор способный выдавать дамп пикселей. Долгие поиски, показали, что такие сенсоры есть только в мышах Logitech. И тут мне повезло, у друга завалялась старя мыша. Разобрав ее, я увидел желанный ADNS. Вот по нему документация.

2013-03-23 13.27.13 В доке даже есть примеры схемы, одна из которых и есть эта мыш. Так что, проблем с пониманием чего к чему нет.

А что делать дальше?

Для начала надо продумать как все это будет работать. 

Сервопривод HXT 900 с ATmega 8

Решил я попробовать как-то раз подключить сервопривод к контроллеру. Дело с такими вещами я раньше не имел, так что купил первую попавшуюся машинку.

Далее пошел копать на нее мануал, но оказалось это дело непростое. Сам производитель поскупился, и написал всего лишь 1 листочек. Hextronik_HXT900_datasheet. Поиски по разным форумам помогли найти мне электрическую схему.

Servo HXT900

 HXT900 с ATmega8 (не пугаться, на макете много лишнего)

 Приведу некоторые важные параметры

  • Напряжение питания: 4.8 – 6 В (но говорят можно и от 9В питать, правда дольше он от этого не прослужит, на деле питал от 3.3В все ОК)
  • Потребляемый ток: Очень долго искал, и только на одном форуме между строк нашел 700 мА, кажется мне, это враки, ибо от USB (500 мА), он работает у меня прекрасно. Источник на изи элктроникс говорит, что до 100 мА. Лично я намерил 180 мА максимум
  • Крутящий момент: 1.5 кг см2
  • Угол поворота: 90 градусов

Теперь о том как им управлять.

  • Коричневый провод – земля
  • Красный – питание
  • Желтый – сигнальный (должно быть не меньше 3.3 В)

Везде говорят, что это простой ШИМ, но верить им не стоит. Несущая частота 50 Гц (20 мс), и положение вала задается шириной импульса. От 0.45 мс ( 2222.2[2] Гц ) до 2.45 мс ( ~408.16 Гц ).

На деле несущая частота ШИМ может быть любой, но не меньше чем ширина импульса крайнего правого положения.

  1. Если частота например 1 Гц, то он 1 раз в секунду будет поворачивать вал на небольшой угол, и так пока не придет к заданному значению.
  2. Если частота будет 200 Гц, то отклик и жесткость выросте (когда на сигнальной линии пусто, то ротор двигателя можно спокойно вращать), но так же упадет крутящий момент.

servo_pulse

 

Примерно так выглядит сигнальная линия

С точки зрения программирования, эта задача очень простая. И даже не стоит того, чтобы занимать аппаратный ШИМ. Так как в приложениях с этим приводом скорее всего он будет не один, а ШИМ один, думаем как сделать все ручками.

Проще всего сделать это с помощью таймера.

В теле задаем делитель и запускаем таймер, так же разрешаем прерывание. (у меня 12 МГц кристалл, делитель не установлен)

sei(); 
TCCR0 |= (0<<CS02)|(1<<CS00); 
TIMSK |= (1<<TOIE0);

и в прерывании уже доводим до частоты. (данный код раз в секунду двигает вал в другое крайнее положение)

ISR (TIMER0_OVF_vect) {
 if(i>j)//(24) 47 - 94 (118) // через столько переполнений пройдет 0.45 и 2.45 мс соответственно, в скобках дествительные
 PORTB &=0;
 if(i>938){//50Гц - это 938 пререполнений таймера при частоте 12 МГц
 PORTB |=(1<<PB1)|(1<<PB2)|(1<<PB0); // 2 диода и серво
 i=0;
 }
 if(bo>46875){ // 1 секунда // каждую секунду меняет задающее значение ротора.
 if(j==24)
 j=118;
  else
 j=24;
 bo=0;
 }
 bo++;
 i++;
}

Можно все это хорошенько формализовать и сделать хоть для каждой ноги, и на каждую прицепить сервопривод.

Напоследок, видео

Полезные ссылки:

Миниатюрный программатор AVR

Отличный программатор, на мой взгляд.

Вот ссылка на него.

Самый маленький из тех что видел.

Особенно радует совместимость с XMega т.к. это MKII клон.

В общем будем копировать=)

Флэшка своими руками

Привет всем. Для создания своей флэшки с блэк джеком и шлюхами я взял модуль памяти M25P32 (документация), контроллер ATMega168 (документация) и конвертер USB<->UART (SerialPort) (документация).

И так. Зачем все это нужно?

Предположим, что мы хотим сделать устройство в котором можно хранить информацию, и при этом считывать ее и записывать могли бы только мы. Или сделать устройство которое автономно бы делало какие либо измерения, а потом забрав его можно было бы узнать чего он там наизмерял. В общем применение этой схемы довольно обширна.

Схема

Без имени-2

Это документация на используемые схемы. Там же и есть способы их подключения.

FT232RL_V202 m25p32 atmega168

 

 

 

 

 

 

По сути же схема выглядит так

 

Протоколы

Здесь мы используем 2 основных протокола. Это UART и SPI оба они реализованы в контроллере, остается только привести их в удобный для себя вид.

Терминал

 

Основные ошибки с UARTом:

  • Забыть линию TXD настроить выходом ( например DDRD |= (1<<PD1) )
  • Скорость передачи лучше брать из стандартного ряда а значения для UBBR из мануала

Для проверки я использовал вот эту прогу (Terminal)

Не забывать при SPI:

  • Задать все порты (входы выходы)
  • Давать задержку между передачей и принятием данных

Программа

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

Вообще-то этот проект сделан чтобы автоматически прибавлять числа и записывать в память, но от изначальной задачи он отличается совсем немного.

Все изменения будут заключены в одном единственном блоке.

Пусть у нас будет 3 комманды:

  1. Запись данных
  2. Считывание данных
  3. Стирание

Изменения будут только в блоке прерывания:

ISR(USART_RX_vect){
 if(command==0xFF){
  command = UDR0;
 }else{
  switch(command){
   case 0x01://Запись данных

   break;
   case 0x02://Чтение данных

   break;
   case 0x03://Стирание данных

   break;
  }
 }
}

Проект

SoftWare

Наверное отдельно рассмотрю как делать ПО для такого типа приложений в другой статье. Но в общем и целом эта программа должна подключаться к одному из COM портов и передавать определенные пакеты данных.

HardWare

Это плата на которой это все тестилось.

2013-02-13 11.40.52

 

Питание так же от USB.

Заключение

Самое лучшее применение этой идеи, я думаю в дистанционных приборах, которые остаются где-либо и записывают что-то. Потом, с помощью специальной программы данные считываются и обрабатываются.