DragonBoard 410c(Debian)でGPIOプログラミング(C言語編):少し解決
前回のエントリではなかなかタクトスイッチを使ったGPIOの入力処理がうまく行かず途中で中断してしまいました。
タクトスイッチの回路をArduinoで動作するか試したり、プログラムを直したりとしていましたが、状況は好転しませんでした。
ふと思い、GPIO_B
が原因?ではないかと思いGPIO_C
に変更してみました。
あと、タクトスイッチを押したらLEDが点灯する様にソースも編集しました。
【blink.c】
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <gpio.h> #define LED "GPIO-A" #define TOUCH "GPIO-C" int main() { int x; int t = 0; int last_t = 0; int led_state = HIGH; if(gpio_open(gpio_id(LED), "out")){ return (-1); } if (gpio_open(gpio_id(TOUCH), "in")){ return(-1); } while(1){ t = digitalRead(gpio_id(TOUCH)); if (t && !last_t){ digitalWrite(gpio_id(LED), led_state); usleep(100000); if(led_state == HIGH){ led_state = LOW; printf("HIGH\n"); } else { led_state = HIGH; printf("LOW\n"); } } last_t = t; usleep(1); } digitalWrite(gpio_id(LED), LOW); return EXIT_SUCCESS; }
入力処理
入力に使用するGPIOのピンをTOUCHとしておき、方向を"in"
とすればオープンは完了です。
if (gpio_open(gpio_id(TOUCH), "in")){ return(-1); }
入力値の取得はdigitalRead()
となります。引数にピン番号を与えることでOKです。値はint
で帰ってきますが、HIGHtおLOWでも判別ができるようになっています。
t = digitalRead(gpio_id(TOUCH));
ではあらためて、make
して実行してみると…
$ make gcc -DPACKAGE_NAME=\"96BoardsGPIO\" -DPACKAGE_TARNAME=\"96boardsgpio\" -DPACKAGE_VERSION=\"0.1\" -DPACKAGE_STRING=\"96BoardsGPIO\ 0.1\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DPACKAGE=\"96boardsgpio\" -DVERSION=\"0.1\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1 -DLT_OBJDIR=\".libs/\" -I. -l96BoardsGPIO -g -O2 -MT blink-blink.o -MD -MP -MF .deps/blink-blink.Tpo -c -o blink-blink.o `test -f 'blink.c' || echo './'`blink.c mv -f .deps/blink-blink.Tpo .deps/blink-blink.Po /bin/bash ../libtool --tag=CC --mode=link gcc -l96BoardsGPIO -g -O2 -o blink blink-blink.o -lsoc libtool: link: gcc -g -O2 -o blink blink-blink.o -l96BoardsGPIO -lsoc $ sudo ./blink HIGH LOW HIGH LOW HIGH LOW ^C
あれ?すんなり動きました。
動作中の動画は後日追記します。
動作状況の動画になります。
おわりに
GPIO_B
が動かないのは原因がわかりませんが、一応動いたので今回のエントリーとしては解決とします。GPIOのピンごとの設定ってあるんでしょうかね。