DragonBoard 410c(Debian)でGPIOプログラミング(C言語編):少し解決

DragonBoard 410c(Debian)でGPIOプログラミング(C言語編):少し解決

前回のエントリではなかなかタクトスイッチを使ったGPIOの入力処理がうまく行かず途中で中断してしまいました。

タクトスイッチの回路をArduinoで動作するか試したり、プログラムを直したりとしていましたが、状況は好転しませんでした。

uepon.hatenadiary.com

ふと思い、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

あれ?すんなり動きました。

動作中の動画は後日追記します。

動作状況の動画になります。

youtu.be

おわりに

GPIO_Bが動かないのは原因がわかりませんが、一応動いたので今回のエントリーとしては解決とします。GPIOのピンごとの設定ってあるんでしょうかね。

/* -----codeの行番号----- */