C
Edison
mraa

【C言語】Intel EdisonでPWM出力

More than 3 years have passed since last update.

ざっとWebを見た限りでは,EdisonをC言語で扱おうという人間は少数派なのかもしれない・・.

Intel謹製のHAL(Hardware abstract layer)らしい,MRAAを使ってみました.

https://github.com/intel-iot-devkit/mraa/blob/master/docs/edison.md
のページに,Edison breakout boardのピンマップが書いてあるので,その表の中から使用したい物理ピンのMRAA Numberを調べて, mraa_hoge_init にわたすようです.hogeの部分はgpio,pwm,spi,uartなど.

MRAAには,C以外にもC++やPython,JavaScript用のインタフェースもそろっているので,お好みな言語をお使いくださいな.

pwm.c
#include <stdio.h>
#include <syslog.h>
#include <mraa.h>

int main(int argc, char *argv[])
{
    mraa_result_t ret;
    mraa_init();

    ret = mraa_set_log_level(LOG_DEBUG);
    fprintf(stdout, "Hello mraa.\nVersion: %s\n", mraa_get_version());

    mraa_pwm_context pwm;

    // The physical pin mapping is defined at 
    // https://github.com/intel-iot-devkit/mraa/blob/master/docs/edison.md
    //
    // For example,
    // MRAA Number(20) => Physical Pin(J18-7)
    pwm = mraa_pwm_init(20);
    if(pwm == NULL){
        return 1;
    }

    mraa_pwm_period_us(pwm, 15*1000);   // 15[ms]
    mraa_pwm_enable(pwm, 1);

    int i;
    for(i=0;i<20;i++){
        mraa_pwm_write(pwm, 0.05*i);
        usleep(1000*1000);  // 1[s]

        float out = mraa_pwm_read(pwm);
        fprintf(stdout, "PWM0 : %f\n", out);
    }


    mraa_deinit();

    return ret;
}

CC = gcc
MRAALIBS = -lmraa

.PHONY: all clean pwm

all: pwm

clean:
    rm -f ./*.o
    rm -f pwm

pwm: pwm.o
    $(CC) -O4 $(MRAALIBS) -o $@ $^

%.o: %.c
    $(CC) -Wall -g -c $<