понедельник, 13 октября 2014 г.

Плата расширения ODROID USB IO

Эта небольшая заметка демонстрирует некоторые возможности платы расширения ODROID USB IO Board. Ядром которой является микроконтроллер PIC18F45K50-QFN.

GPIO

Традиционно GPIO контакты имеют низкий ток, поэтому для корректной работы светодиодов, без резисторов ограничивающих уровень тока , подключим светодионы к разным GPIO линиям, в разъемы RA2 (Red), RB4 (Green), RC1 (Blue), RD4 Yellow), RE1 (White) с общим контактом на пине GND.

Ниже представлен код на Python использующий библиотеку hk_usb_io. Класс ParseText парсит входящий текстовой поток и возвращает список символов, являющимися первыми буквами от названия цветов светодиодов. Класс Blink методом blink принимает список символов и в цикле поочередно зажигает соответствующий светодиод. В привиденном коде будет распарсен собственный код программы.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import re, time
import hk_usb_io

class ParseText(object):
    """"""
    def __init__(self):
        self.set_chars('rgbyw')

    def set_chars(self, chars):
        self._chars=chars

    def get_strings(self, filename):
        with open(filename) as f:
            result=f.read()

        return result

    def parse_strings(self, strings):
        return re.findall('([{}])'.format(self._chars), strings, re.IGNORECASE | re.MULTILINE )


class Blink(object):

    def __init__(self):
        self._chars='rgbyw'

        self._gpio=((0,2), #RA2 Red
                    (1,4), #RB4 Green
                    (2,1), #RC1 Blue
                    (3,4), #RD4 Yellow
                    (4,1)) #RE1 White

        self.usb=hk_usb_io.init()
        for index, port in self._gpio:
            hk_usb_io.sfr_set_regbit(self.usb,0x5b+index,port,1)
            hk_usb_io.sfr_set_regbit(self.usb,0x92+index,port,0)

    def blink(self, chars):

        tmp=list(set(chars))

        l=lambda i: 1 if i in tmp else 0
        values=[l(x) for x in self._chars]

        zip(self._chars, values)

        for index,port in self._gpio:
            hk_usb_io.sfr_set_regbit(self.usb, 0x80+index, port, values[index])


p=ParseText()
s=p.get_strings('uio_gpio_blink.py')
c=p.parse_strings(s)

b=Blink()
for item in c:
    b.blink(item)
    time.sleep(0.2)

Видео демонстрирующее результат работы:

Если список символов заменить на следующий

c=p.parse_strings('rgbyw'*5)

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

ADC

Контроллер PIC предоставляет до 25 каналов 10 битного аналого-цифрового преобразователя (АЦП). На плате я буду использовать каналы RA0 и RA1 относительно общего контакта GND. Входной диапазон по напряжению составляет 0 - 800мВ (примерно). Код для чтения значений очень прост:

import hk_usb_io, time

usb=hk_usb_io.init()

while True:
    print hk_usb_io.adc_ra1(usb)
    time.sleep(1)
DAC

Также контроллер поддерживает 1 канал 5 битного цифрово-аналогого преобразователя (ЦАП). Диапазон выходного напряжения составляет 0 - 2870 мВ, шаг неравномерный и колеблется от 65 до 200 мВ, при расчетном 90мВ. Демонстрационный код sfr_dac.py взят из примеров к самой библиотеке. Результат работы программы отображен в виде следующего графика зависимости выходного напряжения от времени.

0 коммент.:

Отправить комментарий