Friday, September 2, 2011

Пробный запуск

Поскольку приезд ADK задерживается а в загашниках имеется Arduino и USB Host Shield, то грех было не попробовать собрать заменитель ADK и подружить матрицу с Android. На самом деле раньше я уже собирал заменитель ADK, там же описаны проблемы, с которыми я столкнулся, так что тут уже не будем поднимать эту тему, а поговорим о передаче данных и их кодировании.


Итак, напомню, что у нас есть матрица размером 32х16 (512 светодиодов), способная отображать 3 цвета - зеленый, красный и оранжевый. Четвертый цвет - черный (светодиод погашен), т.е. для передачи состояния светодиода достаточно двух битов:
00 - черный
01 - зеленый
10 - красный
11 - оранжевый

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

Android (кодирование):

byte[] frame;
frame = new byte[128];
Arrays.fill(frame, (byte) 0);

/*...*/

	// в циклах с перебором координат по X (i) и Y (z) и формированием color
	frame[i * 4 + (int) z/4] = (byte) (frame[i * 4 + (int) z/4] | (color << (z % 4) * 2));

/*...*/

mActivity.sendCommand(frame);
Arduino (декодирование):

byte msg[128];

if (acc.isConnected()) {

	int len = acc.read(msg, sizeof(msg), 1);

	for (int i = 0; i < len; i++){
		plot(i * 4 + 0, (msg[i] >> 0) & 3);
		plot(i * 4 + 1, (msg[i] >> 2) & 3);
		plot(i * 4 + 2, (msg[i] >> 4) & 3);
		plot(i * 4 + 3, (msg[i] >> 6) & 3);
	}
}

Сама работа с Usb Accessory взята из DemoKit приложения. Результат можно наблюдать на видео:

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

[1] Исходный код LedMatrix
[2] Android Open Accessory API

No comments:

Post a Comment