Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
2
Help us understand the problem. What is going on with this article?
@kumachang

Rubymotion + Konashi でフィジカルコンピューティング

More than 5 years have passed since last update.

みなさま、クリスマスイブをいかがお過ごしでしょうか?
今年はアベノミクスでケーキが良いみたいですね。クリスマスだけに。
ということで、RubyMotion Advent Calendar 2013、24日目スタート!

Konashi とは

konashi に搭載されている Bluetooth Low Energy モジュールで iPhone と通信し、ハードウェアをいろんころんできます。詳しくはこちら↓↓↓↓
http://konashi.ux-xu.com/

何か作ってみよう

オンボード入力端子のボタンでカメラのシャッターを押すアプリを作ってみたいと思います。
実際に作ったアプリを動作させたもの↓↓↓↓
http://youtu.be/2AikiDdx1yE
連写しているように見えますが、連写できていません。そこまで手回らんかった。。。

1.cocoapodsを使ってKonashiのライブラリを導入します。

Gemfile
gem "motion-cocoapods"

2.Rakefileにkonashi-ios-sdkを追加

Rakefile
app.pods do
    pod 'konashi-ios-sdk'
end

3.コントローラーに接続のための下準備

root_controller.rb
def viewDidLoad
  Konashi.initialize
  Konashi.addObserver(self, selector:"update_pio_input", name:KONASHI_EVENT_UPDATE_PIO_INPUT)
end

接続のためのボタンも追加

root_controller.rb
@btn_find = UIButton.buttonWithType(UIButtonTypeRoundedRect).tap do |b|
      b.frame = CGRectMake(10, 100, 80, 50)
      b.setTitle("find", forState:UIControlStateNormal)
      b.addTarget(self, action:"find:", forControlEvents:UIControlEventTouchUpInside)
end
self.view.addSubview(@btn_find )

メソッドを追加

root_controller.rb
def find(sender)
    Konashi.find
end

def update_pio_input
    input = Konashi.digitalReadAll
    if input[0] == HIGH # オンボード入力端子
      @imagePickerController.takePicture
    end
end

findボタンを押すと、接続可能なKonashiの一覧が表示されます。
KONASHI_EVENT_UPDATE_PIO_INPUT はPIOの入力状態が変化したときのイベントとなります。
ライブラリがしっかりしているので、難しい事を考えなくてもiPhoneとKonashiの相互操作が可能になります。

そして次のステップへ!
http://youtu.be/loZad9r8FP8

ソース

Gemfile
source 'https://rubygems.org'

gem 'rake'
gem "motion-cocoapods"
Rakefile
# -*- coding: utf-8 -*-
$:.unshift("/Library/RubyMotion/lib")
require 'motion/project/template/ios'

begin
  require 'bundler'
  Bundler.require
rescue LoadError
end

Motion::Project::App.setup do |app|
  # Use `rake config' to see complete project settings.
  app.name = ''
  app.development do
      app.provisioning_profile = ''
      app.codesign_certificate = ''
  end
  app.pods do
    pod 'konashi-ios-sdk'
  end
end
app_delegate.rb
class AppDelegate
  def application(application, didFinishLaunchingWithOptions:launchOptions)
    @window = UIWindow.alloc.initWithFrame(UIScreen.mainScreen.bounds)
    @window.rootViewController = UINavigationController.alloc.initWithRootViewController(RootController.alloc.init)
    @window.rootViewController.wantsFullScreenLayout = true
    @window.makeKeyAndVisible
    true
  end
end
root_controller.rb
class RootController < UIViewController
  def viewDidLoad
    self.navigationController.setNavigationBarHidden(true, animated:false)
    self.view.backgroundColor = UIColor.whiteColor

    Konashi.initialize
    Konashi.addObserver(self, selector:"update_pio_input", name:KONASHI_EVENT_UPDATE_PIO_INPUT)

    @btn_find = UIButton.buttonWithType(UIButtonTypeRoundedRect).tap do |b|
      b.frame = CGRectMake(10, 100, 80, 50)
      b.setTitle("find", forState:UIControlStateNormal)
      b.addTarget(self, action:"find:", forControlEvents:UIControlEventTouchUpInside)
    end

    @btn_show_camera = UIButton.buttonWithType(UIButtonTypeRoundedRect).tap do |b|
      b.frame = CGRectMake(100, 100, 80, 50)
      b.setTitle("カメラ起動", forState:UIControlStateNormal)
      b.addTarget(self, action:"show_camera", forControlEvents:UIControlEventTouchUpInside)
    end

    [@btn_find, @btn_show_camera].each do |b|
      self.view.addSubview(b)
    end
  end

  def imagePickerController(picker, didFinishPickingImage:image, editingInfo:info)
    self.dismissViewControllerAnimated(true, completion:nil)
    UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil)

  end

  def imagePickerControllerDidCancel(picker)
    self.dismissViewControllerAnimated(true, completion:nil)
  end

  private

  def show_camera
    @imagePickerController = UIImagePickerController.alloc.init
    @imagePickerController.delegate = self
    @imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera
    self.presentViewController(@imagePickerController, animated:true, completion:nil)
  end

  def find(sender)
    Konashi.find
  end

  def update_pio_input
    input = Konashi.digitalReadAll
    if input[0] == HIGH # オンボード入力端子
      @imagePickerController.takePicture
    end
  end
end
2
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
2
Help us understand the problem. What is going on with this article?