воскресенье, 23 ноября 2014 г.

Полу-умный дом, часть 1.

 Контроллер для некоторой автоматизации главным образом печи (обычной дровяной).

Входные параметры:

  • температура на выходе теплообменника печи,
  • температура и влажность в помещении,
  • концентрация СО в помещении,
  • датчик давления воды в водопроводе (побочная функция).

 Основываясь на входных параметрах, хитрым образом управляются следующие штуки:

  • насос отопления,
  • приточный вентилятор (проветривание),
  • вытяжной вентилятор,
  • водяной насос в колодце (побочная функция).

 На 4-х строчном индикаторе показываются все измеренные (входные) параметры.
 Предусмотрен контроль некоторых параметров с сигнализацией выхода за рамки (СО, температура).
 Также предусмотрена связь с вторым контроллером (вторая часть полу умного дома - пока не реализован ) по rs482 для передачи параметров и внешнего управления.

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

Схема тут.

PS: Устройство отработало уже год и себя вполне оправдало.

вторник, 5 августа 2014 г.

Конвертер PS2 - UART

  Для экспериментов собрал данное устройство на завалявшемся контроллере PIC16F628.
  Позволяет подключать PS/2 устройства к последовательному асинхронному порту UART.
  Достоинства решения в разгрузке процессора(супротив непосредственного анализа PS/2 сигнала на GPIO) и независимость правильности работы от его загрузки (своевременная обработка прерывания от устройства).

  Устройство тестировалось на КПК ASUS MyPal a620, который имеет выводы UART на внешнем разъеме.

Исходник прошивки тут.

Схема и прочее тут.

пятница, 7 марта 2014 г.

AVR BASIC интерпретатор

Решил сделать  миникомпьютер  для обучения программированию, и типа игрушки детям. Режим работы -интерпретатор, язык - BASIC, причем для упрощения ввода команд сделал по типу Sinclair BASIC (автоматический ввод команд одной клавишей).
[Image]

Аппаратная часть:
  • atmega328 (2кб RAM - весьма скромно, 32кб FLASH)
  • дисплей 128х64 на st7565 (вроде аналог SED1565)
  • SD карточка для сохранения программ
  • PS/2 клавиатура для ввода

Ограничения:

  • Максимальный размер программы 1400 байт или 255строк
  • Переменные только целого типа (-32768...32768), имя переменных - один символ верхнего регистра в диапазоне A ..Z
  • Для циклов переменные из диапазона A .. J 
  • Массивы 3х типов byte char и int, используется память для программы
  • Нельзя создавать новые файлы на SD, только перезаписывать существующие. Поэтому необходимо подготовить нужно кол-во файлов шаблонов по 2кб (см. папку utils) и записать их на SD card.
Комбинация клавиш
  • ESC - Прервать выполнение / Очистка командной строки (Ctrl+B для Linux console)
  • CapsLock - переключать раскладку Rus/Lat (Rus(cp1251) только для текстов или пометок)

папка проекта тут

исходники тут

Примеры программ:

Посадка на луну(псевдографика)
5 GOSUB 251
10 DIM bZ(5)
15 LET Z(0)=10
16 LET V=70
17 LET F=500
18 LET H=800
19 LET G=1
20 LET U=0
30 REM main
33 LET H=H-V
34 LET V=((V+G)*10-U*2)/10
35 LET F=F-U
36 IF F<0 THEN  LET F=0
37 LET T=H/100
38 IF T<8 THEN  LET Z(1)=7-T
39 GOSUB 225
40 GOSUB 235
41 IF H <= 0 THEN  GOTO 100
44 LET U=0
45 FOR I=0 TO 9                                            
46 LET K=INKEY
47 IF K=32 THEN  LET U=U+10
48 IF U THEN  BEEP 100,RND(20)-60
49 PAUSE 50
50 NEXT I
51 LET Z(4)=0
53 IF F=0 THEN  LET U=0
55 IF U>0 THEN  LET Z(4)=1
60 GOTO 30
100 IF V<5 THEN  GOTO 140
105 LET X=RND(3)+Z(0)-1
106 LET Y=RND(4)+4
108 AT X,Y
110 PRINT $RND(10)+32;
112 BEEP 50,RND(60)-30
115 PAUSE 100
120 GOTO 105
139 STOP
150 STOP                                                   
225 REM p
226 AT 0,0
227 PRINT "V:",V,"m/s ";
228 AT 15,0
229 PRINT "H:",H,"m ";
230 AT 0,1
231 PRINT "F:",F,"tn ";
234 RETURN
235 REM d
237 IF Z(1)>7 THEN  LET Z(1)=7
239 AT Z(2),Z(3)
240 PRINT " ";
241 AT Z(0),Z(1)
242 PRINT "A";
243 IF Z(1)>6 THEN  GOTO 248
244 AT Z(2),Z(3)+1
245 PRINT " ";
246 AT Z(0),Z(1)+1
247 IF Z(4) THEN  PRINT "*";                               
248 LET Z(2)=Z(0)
249 LET Z(3)=Z(1)
250 RETURN
251 FOR A=0 TO 20
252 AT A,RND(2)+6
253 PRINT ".";
254 NEXT A
255 RETURN
Быки и коровы

5 PRINT "Игра быки и коровы"
6 DIM bR(5)
7 DIM bK(5)
10 FOR A=0 TO 4
20 LET R(A)=RND(9)+1
30 FOR B=0 TO A-1
40 IF R(A) <> R(B) THEN  GOTO 50
45 IF A>0 THEN  GOTO 20
50 NEXT B
55 NEXT A
60 PRINT "Введите 5 чисел"
62 FOR A=0 TO 4
65 INPUT C
66 IF C<1 THEN  GOTO 70
67 IF C>9 THEN  GOTO 70
68 GOTO 73
70 PRINT "вводите от 1 до 9"
71 GOTO 65
73 LET K(A)=C
75 NEXT A                                                 
77 LET C=0
78 LET D=0
80 FOR A=0 TO 4
85 FOR B=0 TO 4
90 IF K(A) <> R(B) THEN  GOTO 100
91 IF A <> B THEN  GOTO 96
92 LET C=C+1
95 GOTO 100
96 LET D=D+1
100 NEXT B
110 NEXT A
115 PRINT "Быков:";
120 PRINT C;
124 PRINT " Коров:";
125 PRINT D
130 IF C<5 THEN  GOTO 60
140 PRINT "Угадал!"

четверг, 13 февраля 2014 г.

CubieBook - зарядка

Пришла схема контроля аккумулятора на S-8254A, пристроил ее на старую батарею (лет 5 ей, но почти не использовалась)

сразу вылезла проблема - схема не ограничивает ток заряда (она его вообще не контролирует).

Пришлось модернизировать (добавил компаратор)


схема

Сейчас при начале зарядки (когда ток большой) схема работает в импульсном режиме (частота примерно 0.5Гц) открывая и закрывая зарядной ключ

В итоге мой CubieBook держится на этой старой батареи гдето часа 3 в режиме просмотра фильма

среда, 12 февраля 2014 г.

CubieBook - Программы

оконный менеджер Mate - в репозитории от малины (для ностальгирующих по гному2)

deb http://archive.raspbian.org/mate wheezy main

apt-get update
apt-get install mate-core mate-desktop-environment

по скорости примерно как xfce, но удобнее (для меня)
-----------------
вот еще программы что я почти год назад скомпилировал для моего mk808 , идут и на кубике

там нужно устанавливать библиотеки из папки libs только не нужно ставить libmali  (не совместимая версия)

исходники тут

CubieBook - Разгон

попробовал я немного разогнать А20 на втором кубике

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

изменил конфиг

[dvfs_table]
max_freq = 1200000000
min_freq = 400000000
LV_count =9
LV1_freq = 1200000000
LV1_volt = 1550
LV2_freq = 1100000000
LV2_volt = 1500
LV3_freq = 1008000000
LV3_volt = 1450
LV4_freq = 912000000
LV4_volt = 1400
LV5_freq = 864000000
LV5_volt = 1300
LV6_freq = 720000000
LV6_volt = 1200
LV7_freq = 528000000
LV7_volt = 1100
LV8_freq = 312000000
LV8_volt = 1050
LV9_freq = 144000000
LV9_volt = 1050

ну и задал гувернер и параметры

echo ondemand > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
echo 1200000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq

вроде все работает и не глючит

запускал расчет Пи(pi_css5) на милион знаков, до и после разгона
39.15 sec. (real time) и 34.43 sec. (real time)

CubieBook - Подсветка ЖК экрана

Как я делал подсветку подключенного по LVDS экрана

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

питание у нее 12 вольт, разрешение вместе с управлением яркостью к PB2 (выход PWM) через RC цепочку [img]http://upload.wikimedia.org/wikipedia/commons/e/e7/Low_pass_filter.png[/img]

разрешение подцепил к порту PH7, а управление яркостью к PB2 (выход PWM) напрямую

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


конфиг такой

[lcd0_para]
...
lcd_pwm_not_used = 0
lcd_pwm_ch = 0
lcd_pwm_freq = 10000
lcd_pwm_pol = 1
lcd_max_bright = 100
lcd_min_bright = 50
...
lcd_bl_en_used = 1
lcd_bl_en = port:PH07<1><0><default><1>
...
lcd_pwm_used = 1
lcd_pwm = port:PB02<2><0><default><default>


потом начал искать драйвер этого дела, и ... не нашел

пришлось писать самому

теперь яркость можно регулировать так

echo 70 > /sys/class/backlight/sunxipwm-bl/brightness

ну и всякими гуишными ползунками

CubieBook - Подключение внешней RTC (часов реального времени)

решил написать тут инструкцию на примере ds1307 (i2c интерфейс) и linux

1. Физическое подключение

к кубику 4 провода
выводы
кубик - ds1307
общий = 4
+5вольт = 8
PB19 = 5 (data)
PB18 = 6 (clk)

2. Конфигурация

   [twi1_para]
    twi1_used = 1
    twi1_scl = port:PB18<2><default><default><default>
    twi1_sda = port:PB19<2><default><default><default>

3. Проверка

ставим пакет i2c-tools

запускаем сканирование

i2cdetect -y n
  где n номер шины i2c   (список шин i2cdetect -l)

программа просканирует шину и выведет список устройств в сетке
там будет либо адрес устройства либо UU - если устройство используется

если следовать данной инструкции, то устройство должно появится на шине 1

i2cdetect -y 1

root@cubieez:~# i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --                       

можно пообщаться напрямую

секунды
i2cget -y 1 0x68 0
минуты
i2cget -y 1 0x68 1
часы
i2cget -y 1 0x68 2

смещение есть в даташите на ds1307

стоит иметь ввиду что при первом подключении к питанию ds1307 встает на тормоз (т.е не считает), необходимо ее активировать
"бит активации" это старший бит секунд, его нужно сбросить

i2cset -y 0 0x68 0x00 0x00

в принципе это делается драйвером часов при сохранении даты в rtc

4. Конфигурация и загрузка драйвера

Перед этим лучше проверить - может загружены другие драйвера RTC например встроенный в SOC
например так ls /dev/rtc*
или тут ls /sys/class/rtc

просто обычно по умолчанию linux использует /dev/rtc0, а это первый загруженный драйвер


далее активация

   echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
    modprobe rtc-ds1307

модуль rtc-ds1307 поддерживет следующие чипы
"ds1307" "ds1337" "ds1338" "ds1339" "ds1388" "ds1340" "ds3231" "m41t00" "mcp7941x" "pt7c4338" "rx8025"

соответственно нужно менять строку echo ds1307... подставляя нужный идентификатор

далее "человеческие" команды работы с часами

hwclock -r чтение и вывод на экран
hwclock -s чтение и установка системного времени
hwclock -w запись в rtc системного времени

по умолчанию hwclock читает /dev/rtc0
если нужны другие часы то задаем через обцию -f
hwclock -r -f /dev/rtc1

ЗЫ: пробовал я использовать встроенную RTC в А20, но чтото у меня получилась точность хода ужасная, да и питание нужно 1.3в

CubieBook - подключение микрофона

в моем проекте встала такая задачка , причем микрофон стерео

AllWinner SOCs вообще то имеют вход для микрофона, но создатели кубиков не стали заморачиваться на эту тему и просто не развели на плате эти выводы (как и другие не менее полезные)

Вобщем сейчас кубик имеет 2 входа звука (оба стерео), это линейный вход и вход для fm приемника (контакты FMINR FMINL)
но эти входы предназначены для более сильного (с более высокой амплитудой) сигнала чем микрофон и подключенный туда микрофон в лучшем случае будет очень тихо работать

Поэтому если необходим микрофон нужно усилить его сигнал с помощью предусилителя, например я собрал по такой схеме(для электретного микрофона), и подключил к входам FM на разъеме расширения

теперь конфигурация

[audio_para]
audio_used = 1
capture_used = 1
audio_pa_ctrl = port:PH15<1><default><default><1>


проверяем наличие устройства захвата звука
arecord -l

и переключаем запись на вход FM
для этого необходимо прописать одно из следующих значений в контрольный регистр ADC Input Mux
0 - linein
1 - fmin
7 - micin
(возможно 0 и 7 перепутаны местами я не проверял)
выясняем номер регистра ADC Input Mux по команде amixer contents
в появившемся списке находим ADC Input Mux и запоминаем значение из параметра numid=(24 у меня)

далее даем команду выбора устройства захвата звука

amixer -c 0 cset numid=24 1 
где 0 - номер звуковой карты
24 - номер регистра ADC Input Mux
1 - выбран вход FM

ссылка по теме

CubieBook

Вообщем был у меня ноут сломанный (без матери) и появился кубик2, и решил я их скрестить

вот что получается 

ядро с изменениями

зы: предвидя вопрос - зачем это нужно? отвечаю - просто так.


текущие проблемы:
- не будится после suspend
- не знаю как грузить с жесткого (пока ядро на сд карте)
встречал упоминание о lilo но не встречал рецептов приготовления