福野泰介の一日一創 - create every day

IchigoSodaで作る、IoTイチゴ呼び鈴 - IchigoJam BASIC IoT拡張β

2018/05/28
#IchigoJam #KidsIT #IoT #jig 

ネットからイチゴを振って、呼び鈴を鳴らすIoTのつくりかた。

まずはイチゴづくり。隣の黒いのは何でしょう?


物理にドット絵が描いて作れる「クイックセルズ879円〜@Amazon


IchigoJamのキャラクターコード255、イチゴの形にリアルにドットを並べて、水を掛けて、乾くまで待つ。


付属のスタンドをサーボにテープでくっつける。裏面の穴に差し込んで固定。


プログラムと配線、ともに簡単!(参考、サーボをあやつるPWM - IchigoJamプリント

10 N=IoT.IN() 20 IF N PWM 2,N 30 GOTO 10

(IchigoJam BASIC 1.2β IoTコマンド使用 with sakura.io)


IoTで左右に揺らせるイチゴのポップ完成。


100均に売っていた呼び鈴をサーボをスマホからネット経由でコントロールして叩く!


jig.jp 15th! イチゴの日。

links
- jig.jp
- jig.jpロゴに隠されたひみつ - jig.jp 10周年

改造してプログラミングも楽しい!4千円6足歩行ロボ「FOLO」の組み立てとIchigoJamコントロール

2018/05/27
#IchigoJam #KidsIT 

ELEKITのタチコマ感がかわいい、手頃な新ロボット「フォロ [ MR-9107 ]」は、コンパクトな360度転回&六足歩行機構と、改造のしやすさがステキ!

頭を一旦外して、IchigoJamとモータードライバ経由でつないで、動かしてみました。センサーつけたり、喋らせたり、ネットにつないだりしたいですね。


FOLOAmazonで約4000円とお手頃価格


前後に歩く心臓部。歯車セット用の治具を使ってネジ止め。グリスを塗りながら作ると、静かでなめらかな動きになるはず!(塗らずに組み立てたので一度オーバーホールする予定)


ケーブルを挟んでしまわないように、きれいに収めましょう。電池の格納場所は頭の中心。美しい設計を楽しみながらの楽しい組み立て。


組み立ては簡単、1時間でFOLO完成!
Nitendo Laboで組み立てレッスンした子供へのステップアップにもちょうどいい!


LEDを使った光る目の演出と、音の使い方がかわいい!
赤外線センサー2つで手を認識して付いてくるモードと、障害物を避けつつ動きまくるモードをオデコのボタンで切り替える。


ロボットなので、やっぱり自分でプログラミングしたい!

ドライバーでネジを外し、小さなマイナスドライバーを使いながら身長に顔部分を外せばすぐに制御部分にアクセスできます。 基板に接続されているモーター、電源もどちらも2.54mmピッチなのでラクラク改造。元に戻すことも簡単です。

IchigoDakeとIchigoIgaiで開発、モータードライバ基板は以前の「IchigoJam Tank 2」を、単4x4の電源から3.3Vを作るのにはIchigoJamのレギュレーターをそれぞれ流用。 IchigoJam + こどもモーターボード MapleSyrupの組み合わせも簡単なのでオススメ!

モーターの動作テストはこのように(少し転回か、歩くか、どちらか動きます)

OUT1:WAIT30:OUT0

ぐるぐる走らせるプログラムはこちら(時々ちょっと停止)

10 OUT1:WAIT30 20 OUT16:WAIT30 30 IF RND(4)=0 WAIT60 40 GOTO 10


IchigoDakeだけにして、ボタンを押しながら3.3Vの電源をつないで自律走行ロボットのできあがり。
オリジナルな頭部分をダンボールや、3Dプリンターなどで、工作したり、塗装するとオリジナリティーあふれる自分だけのロボットが作れそう。

センサーや追加の上下を見渡すサーボ、ネットを加えてIoT化など、いろいろ加えるともっと楽しい。
スマホを乗っけて、家の中を警備してもらうのもいいかも!

links
- フォロ [ MR-9107 ]|製品情報 | エレキット (4,104円 at Amazon)
- こどもモーターボード MapleSyrup
- IchigoJam Tank 2 featuring ai.shuttle.jam - 動く魅力!

QRコードが読め、ズームでき、写真が撮れるメガネ開発!オープンソースなスマホMR in Swift4

2018/05/26
#swift 

外カメラ x スマホVR = デジタルメガネ

JSで手軽なWebMeganeもオススメながら、iPhoneネイティブアプリとして作ると、顔認識や、QRコード認識などが高速で楽しい!

リアルタイムにQRコード内容をデコードして、視界をオーバーレイ(上書き)するメガネができた。
megane - qrdetector on GitHub」 Swift4で実装

ウィンクシャッターが便利だったGoogle Glassのように、手軽に写真撮影もついでに実装。
ボリュームダウンキーで、シャッター(初回のみダイアログがでるので、VRにする前に押しておこう)
ボリュームアップキーで、視界をズームすることもできる(現在は、1920x1080の画像をデジタルズーム)

こちら「オタマートで売ってるVRゴーグル」の一番安いもの。ボリュームアップダウンが上からアクセスできる!
ボリュームアップダウンキーのついたイヤホンを接続すると、手元でも操作できるようになって便利。
デジタルメガネなUXづくり、いろいろ試していきましょう。

鯖江の道の駅、西山公園前のバス停。日本語表記しか無い標識にQRコードをつけておけば、リアルタイムに見ている人の母国語に変換できそう。

Let's hack your sight!

AppDelegate.swift

import UIKit @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { return true } func applicationWillResignActive(_ application: UIApplication) { } func applicationDidEnterBackground(_ application: UIApplication) { NotificationCenter.default.post(name: NSNotification.Name(rawValue: "applicationDidEnterBackground"), object: nil) } func applicationWillEnterForeground(_ application: UIApplication) { NotificationCenter.default.post(name: NSNotification.Name(rawValue: "applicationWillEnterForeground"), object: nil) } func applicationDidBecomeActive(_ application: UIApplication) { } func applicationWillTerminate(_ application: UIApplication) { } }

ViewController.swift

// // ViewController.swift // megane, QR code detector glass with VR goggle // // CC BY taisukef on 2018/05/24. // http://fukuno.jig.jp/2133 // import UIKit import AVFoundation import MediaPlayer class ViewController: UIViewController, AVCaptureVideoDataOutputSampleBufferDelegate { override func viewDidLoad() { super.viewDidLoad() self.view.backgroundColor = UIColor.black self.imageView1 = UIImageView() self.imageView2 = UIImageView() let w = self.view.frame.width let h = self.view.frame.height let w2 = w / 2 let h2 = w2 * 1080 / 1920 let y = (h - h2) / 2 self.imageView1.frame = CGRect(x:0, y:y, width:w2, height:h2) self.imageView2.frame = CGRect(x:self.view.frame.width / 2, y:y, width:w2, height:h2) self.view.addSubview(self.imageView1) self.view.addSubview(self.imageView2) self.initNotificationsFromAppDelegate() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } var input:AVCaptureDeviceInput! var output:AVCaptureVideoDataOutput! var session:AVCaptureSession! var camera:AVCaptureDevice! var imageView1:UIImageView! var imageView2:UIImageView! override func viewWillAppear(_ animated: Bool) { self.configureCamera() self.listenVolumeButton() } // notifications foreground and background func initNotificationsFromAppDelegate() { NotificationCenter.default.addObserver(self, selector: #selector(type(of: self).viewWillEnterForeground(notification:)), name: NSNotification.Name(rawValue: "applicationWillEnterForeground"), object: nil) NotificationCenter.default.addObserver(self, selector: #selector(type(of: self).viewDidEnterBackground(notification:)), name: NSNotification.Name(rawValue: "applicationDidEnterBackground"), object: nil) } @objc func viewWillEnterForeground(notification: NSNotification?) { print("foreground") self.listenVolumeButton() } @objc func viewDidEnterBackground(notification: NSNotification?) { print("background") self.removeVolumeButton() } // override func viewDidDisappear(_ animated: Bool) { session.stopRunning() for output in session.outputs { session.removeOutput(output) } for input in session.inputs { session.removeInput(input) } session = nil camera = nil } let DETECT_QRCODE = false func configureCamera() { session = AVCaptureSession() // iPhone Xで実験 //session.sessionPreset = AVCaptureSession.Preset.cif352x288 // 34% 荒い //session.sessionPreset = AVCaptureSession.Preset.vga640x480 // 47% 4:3 なかなかきれい //session.sessionPreset = AVCaptureSession.Preset.iFrame1280x720 // CPU50% 16:9 かわらない? //session.sessionPreset = AVCaptureSession.Preset.hd1280x720 // CPU50% 16:9 きれい session.sessionPreset = AVCaptureSession.Preset.hd1920x1080 // CPU88% 16:9 かわらない? iPhone6でもQRcode offならOK! //session.sessionPreset = AVCaptureSession.Preset.hd4K3840x2160 // CPU93% 16:9 かわらない? QRcode offなら実用的 camera = AVCaptureDevice.default( AVCaptureDevice.DeviceType.builtInWideAngleCamera, for: AVMediaType.video, position: .back) // position: .front do { input = try AVCaptureDeviceInput(device: camera) } catch let error as NSError { print(error) } if (session.canAddInput(input)) { session.addInput(input) } output = AVCaptureVideoDataOutput() // AVCapturePhotoOutput() 写真用 output?.videoSettings = [kCVPixelBufferPixelFormatTypeKey as AnyHashable : Int(kCVPixelFormatType_32BGRA)] as! [String : Any] let queue:DispatchQueue = DispatchQueue(label: "myqueue", attributes: .concurrent) output.setSampleBufferDelegate(self, queue: queue) output.alwaysDiscardsLateVideoFrames = true // 間に合わないものは処理しない if (session.canAddOutput(output)) { session.addOutput(output) } session.startRunning() } var zoom:CGFloat = 1.0 func captureOutput(_: AVCaptureOutput, didOutput: CMSampleBuffer, from: AVCaptureConnection) { // from.videoOrientation = .portrait //デバイスの向きを設定、縦の時 from.videoOrientation = .landscapeLeft //デバイスの向きを設定、landscape left の時 DispatchQueue.main.sync(execute: { var image = self.imageFromSampleBuffer(sampleBuffer: didOutput) image = resizeImage(image: image, ratio: zoom) if DETECT_QRCODE { image = drawQR(image: image) } self.imageView1.image = image self.imageView2.image = image }) } func resizeImage(image: UIImage, ratio: CGFloat) -> UIImage { if ratio == 1.0 { return image } let iw = image.size.width / ratio let ih = image.size.height / ratio let size = CGSize(width: iw, height: ih) UIGraphicsBeginImageContext(size) image.draw(in: CGRect(origin: CGPoint(x:-(image.size.width - iw) / 2, y:-(image.size.height - ih) / 2), size: image.size)) let resimage = UIGraphicsGetImageFromCurrentImageContext()! UIGraphicsEndImageContext() return resimage } func drawQR(image: UIImage) -> UIImage { UIGraphicsBeginImageContext(image.size) let rect = CGRect(x:0, y:0, width:image.size.width, height:image.size.height) image.draw(in: rect) let g = UIGraphicsGetCurrentContext()! g.setStrokeColor(UIColor.white.cgColor) g.setLineWidth(1) let font = UIFont.boldSystemFont(ofSize: 14) let textStyle = NSMutableParagraphStyle.default.mutableCopy() as! NSMutableParagraphStyle let textFontAttributes = [ NSAttributedStringKey.font: font, NSAttributedStringKey.foregroundColor: UIColor.black, NSAttributedStringKey.paragraphStyle: textStyle ] // 顔認識もおもしろい // let detector : CIDetector = CIDetector(ofType: CIDetectorTypeFace, context: nil, options:[CIDetectorAccuracy: CIDetectorAccuracyLow] )! // 読める四角は今のところひとつだけ // let detector : CIDetector = CIDetector(ofType: CIDetectorTypeRectangle, context: nil, options:[CIDetectorAccuracy: CIDetectorAccuracyHigh, CIDetectorAspectRatio: 1.0] )! let detector : CIDetector = CIDetector(ofType: CIDetectorTypeQRCode, context: nil, options:[CIDetectorAccuracy: CIDetectorAccuracyHigh] )! let features : NSArray = detector.features(in: CIImage(image: image)!) as NSArray if features.count > 0 { for feature in features as! [CIQRCodeFeature] { var rect: CGRect = (feature as AnyObject).bounds rect.origin.y = image.size.height - rect.origin.y - rect.size.height // QRコードを上書き! g.beginPath() g.setFillColor(UIColor.white.cgColor) g.addRect(rect) g.fillPath() feature.messageString?.draw(in: rect, withAttributes: textFontAttributes) } } let resimage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return resimage! } func imageFromSampleBuffer(sampleBuffer: CMSampleBuffer) -> UIImage { let imageBuffer: CVImageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)! CVPixelBufferLockBaseAddress(imageBuffer, CVPixelBufferLockFlags(rawValue: 0)) let baseAddress = CVPixelBufferGetBaseAddressOfPlane(imageBuffer, 0) let bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer) let width = CVPixelBufferGetWidth(imageBuffer) let height = CVPixelBufferGetHeight(imageBuffer) let colorSpace = CGColorSpaceCreateDeviceRGB() let bitmapInfo = (CGBitmapInfo.byteOrder32Little.rawValue | CGImageAlphaInfo.premultipliedFirst.rawValue) let context = CGContext(data: baseAddress, width: width, height: height, bitsPerComponent: 8, bytesPerRow: bytesPerRow, space: colorSpace, bitmapInfo: bitmapInfo) let imageRef = context!.makeImage() CVPixelBufferUnlockBaseAddress(imageBuffer, CVPixelBufferLockFlags(rawValue: 0)) return UIImage(cgImage: imageRef!) } // volume switch var initialVolume = 0.0 var volumeView: MPVolumeView? func listenVolumeButton() { volumeView = MPVolumeView(frame: CGRect(x:-3000, y:0, width:0, height:0)) view.addSubview(volumeView!) let audioSession = AVAudioSession.sharedInstance() do { try audioSession.setActive(true) let vol = audioSession.outputVolume initialVolume = Double(vol.description)! if initialVolume > 0.9 { initialVolume = 0.9 } else if initialVolume < 0.1 { initialVolume = 0.1 } } catch { print("error: \(error)") } audioSession.addObserver(self, forKeyPath: "outputVolume", options: NSKeyValueObservingOptions.new, context: nil) } func removeVolumeButton() { AVAudioSession.sharedInstance().removeObserver(self, forKeyPath: "outputVolume") volumeView?.removeFromSuperview() } override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) { if keyPath == "outputVolume" { let volume = (change?[NSKeyValueChangeKey.newKey] as! NSNumber).floatValue let newVolume = Double(volume) if newVolume > initialVolume + 0.05 { if let view = volumeView?.subviews.first as? UISlider { // volume up pressed view.value = Float(initialVolume) if zoom < 12.0 { zoom *= 1.2 } else { zoom = 1.0 } print("zoom: \(zoom)") } } else if newVolume < initialVolume - 0.05 { if let view = volumeView?.subviews.first as? UISlider { // volume down pressed view.value = Float(initialVolume) /* if zoom > 1.0 { zoom /= 1.2 } */ if let image = self.imageView1.image { saveImage(image: image) print("save image") } } } } } // save private func saveImage(image: UIImage) { UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil) } }

megane - qrdetector on GitHub」 in Swift4

links
- WebMegane - your new digital sight / デジタルな視界 on iPhone Safari x VR goggles (JS、webアプリ版)

今までの延長線上に未来なし、攻める鯖江商工会議所と常識反転メガネ

2018/05/25
#sabae #megane #js 

鯖江市内を中心に1846の会員を持つ、鯖江商工会議所の記念すべき第60回通常議員総会。

WebMegane」 JSで作ったブラウザで動くWebMeganeに、反転モードを追加
左右反転させるレンズもプログラム1行で実現できてしまう、デジタル化したメガネ。

強烈に気持ち悪い左右反転視界も、しばらく歩き回っているとなんとかなってしまう不思議。
電話も、ネットも、スマホ、「今までの常識と違う」気持ち悪さも「利便性」には叶わない。

一眼レフがデジタル化し、光学ファインダーから液晶モニター化によるミラーレスが実現したように。 メガネの世界でもレンズレス時代が訪れる。


今までの延長線上じゃだめだと開会宣言する、鯖江商工会議所、黒田会頭。


新任で阪大から来られた福井工業大学、学長で、理学博士の掛下知行さんと鯖江市長!
商工会議所、鯖江市、福井工大による産官学連携も丸10年。


鯖江商工会議所副会頭「」代表の加藤さんによる〆。


サイトリニューアルしていた「日本酒「梵」の酒蔵 | 加藤吉平商店 |


SDGsバッジとメガネバッジを付けた鯖江市長、いよいよ国連本部、ニューヨークへ!
鯖江の市長さん、ニューヨークへ行く!こどもプログラミングで地方が変わる、EDIX&自治体総合フェア!
鯖江の新しい一歩のきっかけに!

Swift4でつくるQRコードをリアルタイムに読むアプリ

2018/05/24
#swift #megane 

iPhoneの本当のおもしろさはプログラミングしないと分からない。
画像認識APIのひとつ、QRコード認識を使って、リアルタイムにQRコードが読めるアプリを作ってみました。

QRコードを認識すると、埋め込まれている文字として上書きします。
(QRコード生成アプリ qrmakeriPhone風スマホ画像素材使用)

Swift4で書く、QRコードの認識プログラムは簡単!カメラからの画像を CIDetector に渡すだけ。
画面内の複数のQRコードをまとめて認識してくれるのがおもしろい!

let detector : CIDetector = CIDetector(ofType: CIDetectorTypeQRCode, context: nil, options:[CIDetectorAccuracy: CIDetectorAccuracyHigh] )! let features : NSArray = detector.features(in: ciimage) as NSArray

まちの標識の先頭につけておき、その人が分かる文字にリアルタイムに、視界を上書きするメガネが簡単にできちゃいそうです。

現実とネットをつなぐインターフェイス、メガネ。
いよいよ実現が近づいてきました!

links
- WebMeganeでMR、JSで手軽に実現、外カメラ映像とCGをミックス!

WebMeganeでMR、JSで手軽に実現、外カメラ映像とCGをミックス!

2018/05/23
#megane #js 

MR = Mixed Reallity。CGと現実を混ぜること。

スマホとVRゴーグルで手軽なデジタルメガネを実現、WebMegane
three.jsと組み合わせて、MR化!

ひとまずシンプルな赤い画面を半透明にして合成。
現実とCGが混ざる世界ができあがった。


カメラ入力とThree.jsのCGをミックス!「redsnow - WebMeganesrc on GitHub
ただ失敗は背景のカメラは立体視非対応で、CGは立体視なので違和感あり・・・。
CGの左右視差はなしにする必要がありそう。外カメラ2つが使えれば、立体視可能にできるかも。


こちらオタマートで販売しているVRゴーグルの一番安いもの。
高いものにはついているボタンがないので、何かインタラクションを付ける場合は、視点の移動を基本にする必要がありですが、デジタルメガネ実現だけなら問題なし!

格安VRゴーグルとJSで、Let's begin to make your WebMegane!

links
- 任天堂伝説のゲーム機、バーチャルボーイ風をスマホVRとWebVRで手軽に創る
- WebMegane - your new digital sight / デジタルな視界 on iPhone Safari x VR goggles

探すアプリシリーズ with 5つ星オープンデータ

2018/05/22
#opendata #odp 

5つ星オープンデータを簡単公開「odp」を使ってデータ公開すると、アプリですぐに使えます。
ただ、アプリにもメンテナンスが必要、APIが古くなったり仕様が変わったりして動かないものを修正対応。


「トイレを探す」
探すアプリシリーズの元祖。2012年、鯖江市が日本初のオープンデータを開始したとほぼ同時に作ったもの。


主にGoogleマップAPIの力ですが、多言語対応してます!

種類ごとの「探すアプリ」自動化して見やすくしたいところ。

以下、調整中

アイコンデザインしたい方、ぜひご一報、または、Code for Fukui GitHubへジョインください!

福井県大野市、PCN大野研究所長で、福井高専の元電波同好会の顧問の先生だった前川さん、松田さんとイチゴMTG
朝摘みイチゴをつまみ、IchigoJamで学ぶ、鯖江Hana道場のこどもたち!

難解アナログ回路へ挑戦、音量測定サウンドモニターボードづくり for IchigoJam

2018/05/21
#IchigoJam #maker 

電源回路の奥深さに触れたネコゴハンマシン。苦手克服のために、共立電子のIchigoJam電子工作パーツセットサウンドレベルメータ」を解析、ユニバーサル基板での実装にチャレンジ。 aitendo大型マトリックス(8x8/I2C)と組み合わせて、なんとなく音量測定サウンドモニターはできました。

音の大きさをマトリックスLEDに表示します。


サウンドレベルメーターの音量検出部分、抵抗値やコンデンサの値を変えながらオシロスコープで観察。


使う部品を決めたので、次は、組み立て。IchigoJamのピン配置がかかれたaitendoのユニバーサル基板、便利!
抵抗 10kΩ、1MΩ、4.4kΩ
コンデンサ 0.1uF x 2
トランジスタ 2SD468
コンデンサマイク WM-61A相当
長ピンソケット 1x14 x2
ユニバーサル基板 P-JAM-EXT-U by aitendo新型基板サイズも


回路図から、ユニバーサル基板での配置を考える時に便利なツール、紙と鉛筆!
使うピンは、アナログ対応のIN2、VCC、GNDの3つだけ。


部品を順番にはんだづけしていきます


できあがったサウンドモニターボードの裏面。リード線をうまいこと使うと楽できます。


IchigoJamに耳が付いたので、「LEDつけて」と大きな声でお願いすると、LEDがつけられます。

10 IF ANA(2)<400 CONT 20 LED1


動画のサウンドモニターのプログラムはこんな感じ。

1 ?I2CW(#70,#21)+I2CW(#70,#81) 2 S=" SOUND MONITOR":FORJ=0TOLEN(S)-1:C=ASC(S+J):FORI=0TO7:[I]=PEEK(C*8+I):NEXT:?I2CW(#70,0,#800,16):WAIT15:NEXT 5 S=0:N=100:FORI=1TON:S=S+ANA(2):NEXT:V=S/N:?V 10 N=10:S=0:FORI=1TON:A=ABS(ANA(2)-V):S=S+(A-S)*(A-S>0):NEXT 20 B=(1<<(S/30))-1 25 FORI=0TO6:[7-I]=[6-I]:NEXT 30 [0]=B 40 ?I2CW(#70,0,#800,16) 50 GOTO10

1行、8x8マトリクスの初期化
2行、タイトル表示 SOUND MONITOR
5行で平均をとって0位置を計測
10行、10サンプルとって最大値を求める
20行、8x8マトリクスに合うように変換
25-30行、スクロール処理
40行、表示
50行、サンプル取得へ繰り返し


秋月電子の高感度マイクアンプキットは3ピン接続だけでお手軽ですが、電源のノイズを大きく拾ってしまうので、波形のきれいな単3電池を使うなど、一工夫いります。

電源、奥深い!


シリコンバレー在住、福井好きのホワイトハッカー、あみるを囲んで福井の未来の語り合い。福井の、日本の、世界のIT力、どんどん上げていきましょー!

IoTネコライフ、ネコゴハンマシン改修とIchigoJam組み込みテクニック

2018/05/20
#IchigoJam #maker 

我が家のネコエサイノベーション、初代はシンプルなカウンター、二代目はぴったり時刻に開くマシン
プリンの箱のまま、1年近く問題なく稼働してましたが、ついにケースに収まりました。

隙間に、DIP化されたLPC1114のマイコンモジュール(350円)を使って収めます。

ソレノイドを動かすための巨大な大きなコンデンサ(6800uF 10V)は、元のマシンから拝借。作動時に電圧が大きく下がってしまうため、制御部分との電源共有化は断念、電源ケーブルは2本出しとなりました。

ソレノイドを動かすためのリレー。リレーを駆動するMOSFET、MOSFETを制御するIchigoJamからのマイコン信号。小さな電気信号を少しずつ大きな力に変えています。

リアルタイムクロック(RCT)モジュールをI2Cで接続できるように配線も合わせてユニバーサル基板に実装が意外と配線が多い!このくらいの規模でも、Upverterで作って基板頼んだ方が効率は良さそう。でも、その場でガシガシはんだづけして作る楽しさは格別。


マイコンモジュールを使った注意点としては、左右の電源とGNDをジャンパ線でつないでおくこと。電圧差が発生し、うまく自動起動しない状態になりました。

SLEEPコマンドを使う場合、BTNピンを1MΩでプルアップするのを忘れずに!自動起動前提で使う場合は、BTNをGND接続でOKです。シリアル接続でESCキーコード送信でメンテナンス可!

あとはシリアルで接続して、IchigoJamを書き込み、プログラムを流し込んでできあがり。

10 LET[10],700,1200,1700,2000,2300:C=5 20 GSB@GETHM:A=0 30 IF N>[10+A] ?N,[10+A]:A=A+1:IF A=C A=0:GSB@WAITM:ELSE CONT 50 @LOOP 60 GSB@GETHM:CLS:?" NOW:";N:?"NEXT:";[10+A] 70 IF N>=[10+A] ?"GOHAN!":GSB@MOVE:WAIT60:A=(A+1)%C:IF !A GSB@WAITM 80 WAIT 60*10:GOTO@LOOP 90 @WAITM:GSB@GETHM:CLS:?" NOW:";N:?"WAIT TOMORROW":IF !N RTN ELSE WAIT60*30:CONT 100 @MOVE:WAIT1:OUT1:WAIT1:OUT0:RTN 200 @GETTIME 210 IF I2CR(#68,0,#700,7) ERR 220 FOR I=0 TO 6:[I]=PEEK(#706-I):[I]=[I]>>4*10+[I]&15:NEXT:RTN 240 @GETHM:GSB@GETTIME:N=[4]*100+[5]:RTN

ACアダプター動作させるので、省電力化しないメンテナンス性と応答性重視のコード。
10行で、7時、12時、17時、20時、23時の1日5回動作するよう設定してます。


時刻設定をいつでも変えられるように、シリアル通信ポートも外に引き出すことにしました。これで、箱を開ける手間なく、設定変更できます。


こちらが元の、IchigoJam完成版をそのまま使ったネコゴハンマシン。1台、回収できました。

他、ネコ関係、外出先からの確認に便利なネコIoTとして、ネコトイレIoTと、IO-DATAの「Qwatch」が活躍中!

ICTで良いネコライフを!

苺人間とIoT、e-messe kanazawaにてPCNこどもプログラミングトークショー

2018/05/19
#PCN #IchigoJam #ishikawa 

行ってきました石川県金沢市で開催「e-messe kanazawa 2018

SDGsはみんなの17コのゴール!
4. 質の高い教育をみんなに
17. パートナーシップで目標を達成しよう


docomoさんブースでのイノシシIoTシステム「みまわり楽太郎
身近な課題、IoTでじゃんじゃん解決していきましょう!


白山市IoT推進ラボの報告会、今年スタートした国際高専の福田さん!IchigoJam利用、ご紹介いただきました。
石川県白山麓で育むグローバルイノベーター、国際高専初訪問としゃべるIchigoJamくん


も、もしやこの方々はお仲間でしょうか?! by 弓月 ひろみさん
東京のEDIXから直で駆けつけたPCN松田さんとPCNとこどもプログラミング紹介。

ドラえもんの映画にもカッコ良く登場したという、プログラミング。 地元から子供ヒーローが多数誕生させるのが近道です!(算数、英語、音楽など、IchigoJam用自習教材、IchigoJamプリントはこちら


弓月ひろみさんによる海外IT事情紹介。お互い刺激しあってじゃんじゃん発信したいですねっ。

ちょうど今週末開催のMaker Faire Bay Areaの迫力動画もどうぞ!

「MakerFaire Bayareaってどんなんですか?」と聞かれていちばん分かりやすい答えがこれです。 by 河合 太郎さん


金沢工大学生によるイチゴ栽培自動化マシン!


マシンの制御コンピューターやセンサー部、むき出しのマシンの中身を見せ、子供の好奇心を刺激しましょう


同じく金沢工大生の目薬自動化ロボ!大掛かり感がステキすぎ


画像認識で目の位置を認識し、ステッピングモーターで位置合わせ、圧力センサーで1滴落とす力分DCモーターで押すシクミ!


ペンや割り箸を脚にして、なんとサーボ2つで歩くロボット「FabWalker ε by エレキット」
IchigoJamでも制御したい!


PFUと言えば、ハッピーハッキングキーボード(HHK)、キーボードは現代カウボーイの鞍!
PS/2にも対応いただきたいところですが、PS/2 USB逆変換アダプタを使えば、IchigoJamでも使えます!


かほく市ではPCN金沢によるIchigoJam大活躍!


加賀市に登場「KAGAものづくりラボ
加賀市民や18歳以下は年会費無料!3Dプリンター、カッティングマシンなどが使えちゃいます。
Hana道場のようなものづくりスペース、どんどん広まる!


ラズパイゼロを使ったシンプルに光センサーをはりつけ、コーヒー豆の残量を通知するIoT。
工場などでのちょっとした監視に便利なIoT。IchigoSodaでも作れそう!
福井県庁職員向けIoTプログラミング講習会、世界初のIchigoSodaワークショップでの気づきと対策


福井高専の先輩がいる日立による機械学習じゃんけん!AI x IchigoJamもやりたいところです。


不正ツールを禁止するポスター。何が「不正ツール」でどういう行為が「ズル」なのか悩ましい。
ルールを守るだけでなく、ルールを作ってもっと楽しく遊んでほしい。


関東から遠征、PCN前橋!


PCNブースでは、ちっちゃいコからちょっとお兄さんまで3種 IchigonQuest、IchigoJam、IchigoLatte のラインナップ! 子供には一人一台自分パソコンでクリエイティビティを刺激しましょうー


PFUの会長さんと!お呼びいただきありがとうございました!


あるPFUの人の作品「VeryBerry!
足が生えたイチゴが走るシュールなゲームがステキ!


許諾いただいたので、なわとびさっちゃんをベースにIchigoJamゲーム化!
迫るトリを避け、ハナを集める苺人間ゲーム「VeryBerry!


キャラクター作成に使わせてもらったツール「Ichigojamのキャラクタ作成
苺人間の足デザイン。2パターンつくって、走らせる(RUN on IchigoJam

1 POKE 224*8,56,40,72,144,128,0,0,0 2 POKE 225*8,48,176,104,8,12,0,0,0 10 LC0,15:?CHR$(255,28,31,224+A):A=!A:WAIT10:CONT

トリパターンを作って、なわとびさっちゃんをベースに、ジャンプゲーム化

3 POKE 226*8,12,24,24,127,152,24,12,0 10 CLS:Y=15:V=99:S=0 20 IF V!=99 Y=Y+V:V=V+1:A=1 30 IF Y>15 Y=15:V=99 40 IF INKEY()=32 AND Y>5 V=-2 50 LC 0,Y:?CHR$(255,28,31,224+A):A=!A 60 IF RND(5)=0 LC31,5+RND(12):?CHR$(226) 70 WAIT 5:SCROLL LEFT 80 IF SCR(0,Y) OR SCR(0,Y+1) ?S:BEEP30,40:END 90 GOTO 20

ハナを登場させて、スコア表示してできあがり!

4 POKE 227*8,40,84,130,84,130,84,40,0 60 IF RND(5)=0 LC31,5+RND(12):?CHR$(226+RND(2)) 80 IF SCR(0,Y)=226 OR SCR(0,Y+1)=226 ?S:BEEP30,40:END 95 IF SCR(0,Y)=227 OR SCR(0,Y+1)=227 S=S+1:BEEP4,3

VerryBerry! for IchigoJam (RUN on IchigoJam web)
東茶屋街近くの居酒屋割烹 田村(田村で検索、ナンバーワン!)
有名人ご来店リスト」のweb公開がユニーク!


のどごし良しの「金沢田村うどん


ごはん少なめがバランス良し「ブリの太巻き


「e-messe kanazawa 活きるIoT もっとひろがるICT」楽しいIoTづくりはじめましょう

links
- 1時間半でわかる叡智の結晶「IoT」 - IchigoJam x sakura.io 情報セキュリティ実習 in 高知高専
- SWTokyo Maker@MakerFaireTokyo(東京ビッグサイト) - スタートアップウィークエンド東京 | Doorkeeper(IoTコーチします!)

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — CC BY 4.0」の下に提供されています。
CC BY 福野泰介 - Taisuke Fukuno / @taisukef / high-res profile image