Библиотека для работы с MMA745х [MMA7456L]

Решил я сделать своей любимой подружке, забавное поздравление. Смысл игрушки показывать некоторый текст при ее перемещении, основываясь на инерции глаз.
Ака что-то типа такого radiokot.ru/circuit/digital/game/02/ но только с акселерометром, благо сейчас они стоят по 20грн за штуку и не это не так критично.
Дело это называется propeller clock.

Введение введено, теперь об акселерометре. и собственно о библиотеке.
Акселерометр позволяет работать в двух режимах SPI и I2C первый был откинут, не знаю почему, но так вышло. Что бы акселерометр слушал I2C надо подцепить вывод CS к VCC. Есть еще один интересный момент, в даташите адрес указан 0x1D, но указан он с смещением (ака без учета бита RW), а значит оригинальный адрес будет равен 0x3A, еще одна интересная особенность акселерометр не реагирует на вывод IADDR0, глюк ли это или нет, неизвестно.

Данные пересылаются в акселерометр через, почти, стандартный i2c. Почему почти, потому что при записи в него не надо выполнять лишних Start-state, stop-state.

В коде это выглядит вот так.

i2c_start();
i2c_send(ACC_ADDR);
i2c_send(reg);
i2c_send(val);
i2c_stop();


Функция в библиотеки называется set_reg(uint8_t reg, uint8_t val), где первый аргумент — адрес регистра, второй, собственно, значение.

Чтение, чтение происходит как обычно. как и во всех цивилизованных i2c устройствах.
Функция для чтения называется get_reg(uint8_t addr), аргумент — название регистра.
Да, я постарался и полностью задефил все имена регистров, и немного больше.

Чтение данных из акселерометра производится функцией get_cords с возвращаемой структурой из 3-х байт, по Х, У, нет не Й, Z
Сам акселерометр имеет как минимум 3 метода работы:
  • Измерения ускорения
  • Level, ака по барьеру вызов прерывания
  • По импульсу (движения) вызов прерывания
Важно: После установки прерывания его надо сбросить, записав в регистр INTRST сначала бит прерывания, а потом 0. Для этого у меня в библиотеки есть функция clr_int()
Не столь Важно: во время Level-mode — измерение значений ускорения невозможно, как написано в даташите, «из-за того что бы не поломать тайминги»

Для моей игрушки, все что мне надо — это pulse-mode который по прерыванию будет мигать светодиодами в хитрой последовательности, выводить массив по прерыванию.
Схема самого девайса не сложна.


Кстати говоря библиотека вполне справедлива и для акселерометра mma7455
Проект winavr-2010 можно найти в приложение, Архив mma7456l.zip сами библиотеки

а также очень советую обглазеть вот этот документ http://www.freescale.com/files/sensors/doc/app_note/AN3468.pdf

У меня правда возникло множество вопросов с синхронизацией изображения при таком propeller выводе, но это уже другая история, для другого топика

Ах да, Bad Gateway 502 ой как не радует при публикации статьи
  • +4
  • 02 января 2012, 16:21
  • letni
  • 2
Файлы в топике: leds_maker.zip, mma7456L.zip

Комментарии (14)

RSS свернуть / развернуть
Ну название-то поправьте)
0
а имхо, с названием все ок… было
0
Ну буковки в названии микросхемок прописные принято юзать.
0
Да-да, это справедливо. Ибо очень часто можно перепутать l и 1, скажем, а вот L и 1 уже не перепутаешь.
0
Это должно звучать, мне все равно как оно работает, мне главное что буковки были красивые. Впрочем поправил
0
Большое, человеческое спасибо :)
0
так покажите Ваше чудо техники =) интересно
0
http://www.youtube.com/watch?v=kKp7wVS0qgk

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

Ставить простую задержку, ну оно не всегда попадает, использовать Case 3: Double Pulse Detection в акселерометре тоже не шик, так как там тоже надо устанавливать время между импульсами. Пока я весь в раздумьях как это сделать, да и с помощью акселерометра я немогу узнать в какую сторону идет взмах (лево и право довольно относительные понятия) и в каком виде его надо отображать(относительно лево и право либо в нормальном либо в зеркальном виде)
0
интересная штучка. спасибо за видео =)
да, с «лево, право» было бы намного круче, а то так мало, что разглядеть можно =)
0
насчёт Bad gateway 502 это надо DI HALT-у сказать, чтоб выкинул уже этот кривой nginx и поставил лайти. При том что последний ещё и умеет корректно работать с fastCGI.
0
та дело не в nginx -е, а дело в количестве народа обитающего здесь. Имхо просто стоит больше платить хостеру. Хотя я хз как тут все устроено.
0
да и с количеством народа оно слабо коррелирует. например в последнее время 502 ночью стабильно вываливается. хотя конечно, мб просто падает от вечерней нагрузки, а потом не поднимается… но достает порядком. особенно когда многа букаф накатал, а на кнопку «добавить» тебе отвечает 502…
0
А почему бы не упростить схему исключив 74HC5950.
Портов как раз хватает разве что програмно придется разбросать на свободные пины.По току на ногах AVR хватит для светодиодов с головой, тем более что и источник питания батарейка таблетка много не возьмешь.
0
Да в следующей версии, которую и подарил я так и сделал. Просто на той плате которая была уже висела hc595
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.