А вот до нее у меня руки уже дошли. Я не очень понимаю, почему все так мастурбируют на Arduino ну акромя конечно кучи примеров и библиотек. Ценник дорогой, Arduina UNO таже стоит от 20 австралийских баксов, за 3 элемента на плате, типа сонара и пары резюков требуют аж 10 автралийских баксов. А мощи то в ардуине както и не так уж и много.
Поглядел я на это дело и заказал Stellaris LaunchPad всего за 12.99USD. Иногда поговаривают бывает распродажа и можно купить ее за 4.99USD.
Причем плата на достаточно мощном ARM проце Cortex M4F.
Итак, чтож мы имеем в итоге:
Цена: 12.99USD
Процессор: 2xCortex M4F по 80Mhz каждый
Flash: 256kb
SDRAM: 32kb
Порты: USB, I2C
GPIO: 43
Таймеры: 12 штук
Вообщем хоть целую операционку можно написать и запускать и это все будет работать.
На плате также есть 2 кнопки для управления и 1 кнопка резет. Датчик температуры и прочие ништяки в виде 3x цветного светодиода.
Поковыряв стандартные экзамплы с миганием набортного светодиода, я решил что надо бы сделать свое мигание в стиле Arduino, чтобы было со своими кнопками и лампочками.
Для начала надо установить Code Composter Studio, как это делается я объяснять не буду, мануалов и интернетах полно, например можно это почитать тут.
Далее я собрал макетную плату, получилось что то типа такого:
С одной стороны:
С другой стороны:
Идея скетча состоит в том, чтобы при нажатии на кнопку загорался собственно тот светодиод с какой стороны нажата кнопка. Если нажаты обе кнопки, то загорается ближайший светодиод.
А теперь немного говнокода:
/* * main.c */ #include "inc/hw_gpio.h" #include "inc/hw_ints.h" #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "driverlib/sysctl.h" #include "driverlib/interrupt.h" #include "driverlib/gpio.h" #include "driverlib/timer.h" #include "drivers/buttons.h" #include "driverlib/rom.h" #include "led-test.h" #define LED_FORWARD GPIO_PIN_0 // светодод FORWARD висит на выводе B0 #define LED_RIGHT GPIO_PIN_5 // светодод RIGHT висит на выводе B5 #define LED_LEFT GPIO_PIN_6 // светодод LEFT висит на выводе B6 #define LED_REVERS GPIO_PIN_7 // светодод REVERS висит на выводе B7 #define BUTTON_LEFT GPIO_PIN_4 // кнопочка 1 висит на выводе F4 #define BUTTON_RIGHT GPIO_PIN_0 // кнопочка 2 висит на выводе F0 #define BUTTON_ALL BUTTON_LEFT|BUTTON_RIGHT // обе кнопки void main(void) { SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN); // выставляем частоту SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); // включаем GPIO группу B в нее у нас воткнуты светодиоды SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); // включаем GPIO группу F - это кнопки HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY_DD; // страшное колдунство заставляющее кнопки работать HWREG(GPIO_PORTF_BASE + GPIO_O_CR) |= 0x01; // страшное колдунство заставляющее кнопки работать HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK) = 0; // страшное колдунство заставляющее кнопки работать GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE,LED_RIGHT); // инициализируем светодиод RIGHT GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE,LED_LEFT); // инициализируем светодиод LEFT GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE,LED_FORWARD); // инициализируем светодиод FORWARD GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE,LED_REVERS); // инициализируем светодиод REVERS GPIOPinTypeGPIOInput(GPIO_PORTF_BASE, BUTTON_ALL); // инициализируем кнопки GPIOPadConfigSet(GPIO_PORTF_BASE, BUTTON_LEFT, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU); // конфигурируем кнопки GPIOPadConfigSet(GPIO_PORTF_BASE, BUTTON_RIGHT, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU); // конфигурируем кнопки GPIOPinWrite(GPIO_PORTB_BASE,LED_FORWARD|LED_REVERS|LED_LEFT|LED_RIGHT, 0x0); // пишем на всякий случай во все светодиодные регистры 0, чтобы светодиоды потухли for(;;) { // бесконечный цикл unsigned long key_switch; // создаем переменную key_switch = GPIOPinRead(GPIO_PORTF_BASE, BUTTON_ALL); // получим в переменную состояние кнопок //LEFT if(key_switch == 1) { //если в переменной key_switch обнаружим 1 GPIOPinWrite(GPIO_PORTB_BASE,LED_FORWARD, 0x0); // гасим светодиод FORWARD GPIOPinWrite(GPIO_PORTB_BASE,LED_LEFT, 0x40); // зажигаем светодиод LEFT SysCtlDelay(3000000); // задержка в 3мс GPIOPinWrite(GPIO_PORTB_BASE,LED_LEFT, 0x0); // гасим светодиод LEFT SysCtlDelay(3000000); // задержка в 3мс } //RIGHT if(key_switch == 16) { //если в переменной key_switch обнаружим 16 GPIOPinWrite(GPIO_PORTB_BASE,LED_FORWARD, 0x0); // гасим светодиод FORWARD GPIOPinWrite(GPIO_PORTB_BASE,LED_RIGHT, 0x20); // зажигаем светодиод RIGHT SysCtlDelay(3000000); // задержка в 3мс GPIOPinWrite(GPIO_PORTB_BASE,LED_RIGHT, 0x0); // гасим светодиод RIGHT SysCtlDelay(3000000); // задержка в 3мс } //REVERSE if(key_switch == 0) { //если в переменной key_switch обнаружим 0 GPIOPinWrite(GPIO_PORTB_BASE,LED_FORWARD, 0x0); // гасим светодиод FORWARD GPIOPinWrite(GPIO_PORTB_BASE,LED_REVERS, 0x80); // зажигаем светодиод REVERS } //FORWARD if(key_switch == 17) { //если в переменной key_switch обнаружим 17 GPIOPinWrite(GPIO_PORTB_BASE,LED_REVERS, 0x0); // гасим светодиод REVERS GPIOPinWrite(GPIO_PORTB_BASE,LED_FORWARD, 0x1); // зажигаем светодиод FORWARD } } }
Теперь можно посмотреть как это все работает в живую:
В принципе и все, часть кода мне самому непонятна, взял из всяких скетчей посвященных Stellaris LaunchPad, особенно с выставлением регистров на кнопках.
Так что буду дальше разбираться.
Комментариев нет:
Отправить комментарий