mraa를 사용하여 mruby on intel edison으로 무언가하기

12993 단어 Edisonmraamruby
mruby-mraa 을 만들었기 때문에
mruby on intel edison 으로 무언가를 해 보았습니다.

문서는 전혀 쓰지 않았고, SPI는 통신 상대가 없었기 때문에 에코백 정도밖에 확인할 수 없었습니다만…

추가



`Mraa::Gpio.isr에 문제가있는 것 같습니다.
자주 SEGV를 일으킨다.
현재 원인 조사중(callback의 함수가 GC로 회수되어 버리고 있는 것일까?).

추가 2(R.I.P. Mraa::Gpio#isr)



왜 SEGV가 일어나는지, 어쩐지 알았다(의도)입니다만,
자신의 솜씨로는 수정할 수 없다고 판단해 isr 는 봉인했습니다…
대신 Mraa::Gpio#irq를 추가했습니다.
GPIO의 인터럽트 타이밍에서 irq 플래그만 설정합니다.
이 irq는 read clear(읽는 자동적으로 클리어 된다)로 했습니다.
우선, 이렇게 해 두면 다른 방법으로, 비동기 처리도 가능할까. 그리고.
함께 샘플도 수정했습니다.

Bochibochi 문서를 작성합시다.

아래 준비



htp // 이오 tdk. 그렇다면 l. 이 m/레포 s/1.1/이니 l가 c c/c/
에 있는 mraa가 0.6.0이므로 그것을 기반으로 함수를 래핑하여 mruby-mraa를 만들었기 때문에
라이브러리를 업데이트합니다.

에디슨 측


edison$ opkg upgrade
edison$ opkg update

mraa를 업데이트합니다.

Windows측



이번에도 「 intel edison 용 mruby를 Windows에서 크로스 컴파일 」마찬가지
Windows PC에서 크로스 빌드합니다.
크로스 컴파일러에 들어 있는 라이브러리가 낡기 때문에, 이쪽도 0.6.0에 갱신합니다.
제대로 된 갱신 방법이 있을지도 모릅니다만, 모르기 때문에 이하의 순서로 갱신했습니다.
1. htp // 이오 tdk. 그렇다면 l. 이 m/레포 s/1.1/이니 l가 c c/c/ 에서 libmraa0_0.6.0_i586.ipk DL
2. ipk는 zip이므로 전개한다
3. 안에 data.tar를 확장합니다. 그러나 리눅스의 심볼릭 링크를 포함하는 것 같습니다.
usr/lib/libmraa.sousr/lib/libmraa.so.0 의 전개에 이끼므로,
usr/lib/libmraa.so.0.6.0 를 복사하여 위의 두 가지를 만듭니다.
4. 컴파일러로 usr 다음 파일 덮어쓰기 복사

mruby 빌드



intel edison 용 mruby를 Windows에서 크로스 컴파일 」에서는 호스트측도 edison측도 같은 mrbgems/default.gembox 를 사용하고 있었습니다만,
호스트 측 라이브러리에는 mraa가 포함되어 있지 않으므로 호스트 측과 edison 측 gemobox 파일을 변경합니다.mrbgems/default.gemboxmrbgems/edison.gembox라는 파일 이름으로 복사하고,

build_config.rb
MRuby::CrossBuild.new('edison') do |conf|
(省略)
  conf.gembox 'edison'
(省略)
end

그리고 다시 씁니다.

그런 다음 mrbgems/edison.gemboxconf.gem :github => 'nocd5/mruby-mraa'를 추가하지만,
샘플에서 Sleep을 사용하기 때문에conf.gem :github => 'matsumoto-r/mruby-sleep'또한 추가합니다.

mrbgems/edison.gembox
  conf.gem :github => 'nocd5/mruby-mraa'
  conf.gem :github => 'matsumoto-r/mruby-sleep'

나머지는 make

무언가



수중에 I2C로 통신할 수 있는 조도 센서(Si1145)가 있었으므로,
조도 센서의 데이터에 맞추어 PWM의 듀티를 변경하고 LED의 밝기를 조정해 보았습니다.
GP15의 상승으로 종료합니다.

sample.rb
p RUBY_VERSION
p Mraa.version
si7013_adr  = 0x40
si1145_adr  = 0x60
adxl345_adr = 0x1d

puts "I2C-1 SDA : " + Mraa.pin_mode_test(Mraa::INTEL_EDISON_GP20, Mraa::PIN_I2C).to_s
puts "I2C-1 SCL : " + Mraa.pin_mode_test(Mraa::INTEL_EDISON_GP19, Mraa::PIN_I2C).to_s
puts "PWM-1     : " + Mraa.pin_mode_test(Mraa::INTEL_EDISON_GP13, Mraa::PIN_PWM).to_s
puts "GPIO-15   : " + Mraa.pin_mode_test(Mraa::INTEL_EDISON_GP15, Mraa::PIN_GPIO).to_s

# Initialize LightSensor
i2c = Mraa::I2c.new(1)
i2c.address(si1145_adr)
# PARAM_WR=0x10
i2c.write_reg(0x30, 0x17)
# WRITE TO RAM (ADDR=0x01)
i2c.write_reg(0xA1, 0x18)

def readSensorData(i2c)
  # Start Mearsurement
  i2c.write_reg(0x06, 0x18)
  # ALS_VIS
  als_vis = i2c.read_reg(0x22) + (i2c.read_reg(0x23) << 8)
  # ALS_IR
  als_ir  = i2c.read_reg(0x24) + (i2c.read_reg(0x25) << 8)

  return als_vis, als_ir
end

gpio = Mraa::Gpio.new(Mraa::INTEL_EDISON_GP15)
gpio.enable_irq(Mraa::Gpio::EDGE_RISING)
p "gpio.irq:" + gpio.irq.to_s

pwm = Mraa::Pwm.new(Mraa::INTEL_EDISON_GP13)
Mraa.result_print pwm.owner(true)

pwm.period 10
pwm.write 1.0
pwm.enable(true)

Sleep::sleep(1)
base_vis, base_ir = readSensorData(i2c)
while true do
  current_vis, current_ir = readSensorData(i2c)

  pwm.write base_vis.to_f/current_vis.to_f

  Sleep::usleep(100000)

  if gpio.irq then
    p "gpio.irq:" + gpio.irq.to_s
    p "irq is asserted"
    gpio.disable_irq
    break
  end
end

Sleep::sleep(1)

p "-- exit --"

어쨌든 동영상을 보았습니다.

htp : //와 같이. 베 / tsCゔぁ MTG 1g

좋은 웹페이지 즐겨찾기