2016年11月30日水曜日

RaspberryPi Zero を Samba サーバとして構築してみる

概要

RaspberryPi Zero に USB の外付け HDD を接続してマウントし、そのボリュームを Samba で NAS として公開することでネットワークストレージを作成してみます
動作確認は Mac を使って RaspberryPi 上の領域を覗いてみます

環境

  • RaspberryPi Zero (Jessie 8.0)
  • Samba 4.2.10
  • Mac OS X 10.12.1 (動作確認)

外付け HDD をマウント

まずは RaspberryPi Zero に外付け HDD をマウントします
とりあえず素直に USB で接続しましょう
RaspberryPi Zero には USB3.0 端子がないので、microUSB から変換して接続しました
もちろん microUSB で使える外付け HDD であればそのまま接続すれば OK です
今回は exFAT の HDD をマウントしました
exFAT の HDD をマウントする手順は前回の記事を参考にしてください

Samba インストール

素直にインストールします

  • sudo apt-get -y update
  • sudo apt-get -y install samba

で完了です
インストールできたバージョンは冒頭に記載のバージョンになります

Samba 用のユーザの作成

接続用のユーザを作成します

sudo smbpasswd -a pi

好きなパスワードを設定して完了です
この「pi」ユーザは samba 用の接続ユーザになるので、SSH でログインするユーザとは別になるのでご注意ください

設定ファイルの編集

マウントして外付け HDD を samba のマウント先として設定します

  • sudo vim /etc/samba/smb.conf
[pi]
path = /mnt/hdd1
read only = No
guest ok = Yes
force user = pi

を一番下に追記すれば OK です
で設定したら smbd を restart しましょう

  • sudo service smbd restart

動作確認

今回は Mac から動作確認します
Finder を開いて「移動」->「サーバへ接続」を選択します

すると接続のダイアログが表示されるので

smb://raspberrypizero.local/pi

rpi_samba_with_mac_input_path.png

みたいな感じで入力してください
ホスト名の部分は avahi が RaspberryPi 上で動作していれば上記でいけるはずです
もちろん IP アドレスでも OK です
「/pi」の部分は smb.conf で設定したセクション名「[pi]」になります
なのでこの部分を書き換えた場合は Finder でマウントする際のパスも変更してください

認証用のダイアログが表示されるので認証しましょう
ここで入力するパスワードは smbpasswd で作成したユーザとパスワードを入力してください

問題なく接続できれば RaspberryPi Zero に接続した外付け HDD の内容が確認できると思います
ディレクトリを作成したりすればすぐに反映されるのが確認できると思います

最後に

RaspberryPi Zero に USB の外付け HDD を接続してネットワークストレージ化してみました
今回はメジャーな samba を使いました

結構簡単にできるので RaspberryPi が自宅で動かせる人にはおすすめです

ただ、このままだと少しつまらないので次は

  • グローバルからマウントできるようにする
  • Chromecast と連携する

あたりをやってみたいなと思っています

2016年11月29日火曜日

RaspberryPi に exFAT フォーマットの USB 外付け HDD を接続してみた

概要

RaspberryPi に exFAT 形式の外付け HDD を接続しマウントしてみました
exFAT は Mac で HDD をフォーマットする際に指定できるフォーマットです

環境

手順

とりあえず RaspberryPi に HDD を USB 接続します
今回は RaspberryPi Zero を使用したので microUSB から USB に変換して接続しています

  • sudo fdisk -l
Device     Boot Start       End   Sectors   Size Id Type
/dev/sda1  *        2 312170495 312170494 148.9G  7 HPFS/NTFS/exFAT

となって認識していることを確認します
GPIO 4 ピンを safe モードにして 0.6A -> 1.2A の増幅は不要でした

あとは必要なパッケージをインストールしてマウントしていきます

  • sudo apt-get install exfat-fuse
  • sudo mkdir /mnt/hdd1
  • sudo mount /dev/sda1 /mnt/hdd1

でマウントできます

  • df -h /dev/sda1
df -h /dev/sda1
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       149G  142G  7.3G  96% /mnt/hdd1

最後に

RaspberryPi Zero で exFAT の HDD をマウントしてみました
必要であればあとは /etc/fstab に自動マウントの設定をしておけば良いと思います

UUID=5839-B0BA  /mnt/hdd1       exfat   auto,exec,rw,user 0       0

外すことも考えて fsck のチェックはなしにしておくと良いと思います

参考サイト

2016年11月26日土曜日

LPIC201 に合格するまで

概要

LPIC (Linux Professional Institute) 201 を受験して合格したので受験までの流れと学習方法を備忘録がてら残しておきます

流れ

まず全体的な流れですが以下の通りです

  1. LPIC アカウントの申し込み
  2. ピアソン VUE アカウントの取得と受験の登録
  3. お勉強
  4. 当日受験する

という感じです
ぶっちゃけ一番たいへんだったのは 1 2 の流れでした

申し込み

基本的には Web ですべて行います
受験費用の支払いもクレジットカードを使って Web ですべて行えます

LPIC アカウントの取得

LPI から始まるアカウントを取得すれば OK です
LPIC の Web サイトから登録してください
ちょっと記憶が曖昧なのですがメールアドレスだけあれば登録できます
個人情報の他、職種なども入力します

登録した個人情報の住所宛に認定書が届くのだと思います

ピアソン VUE アカウントの取得と受験日の登録

受験するには LPIC アカウント以外にピアソン VUE のアカウントが必要になります
基本はこのページを参考にすれば OK です
LPIC アカウントとは別のアカウントになるので注意してください
完全に別のページに飛ばされて作業することになります
受験の登録や決済などはすべてこちらのアカウントを使って行うことになります

詳細な方法はサイトを参考にすればできると思います
受験をする際には会場と日時を選択することができるので自身の好きな場所と日時を選択して受験を申し込んでください

お勉強方法

難関だったアカウントの登録と受験の登録が完了すればあとは勉強するだけです
ちなみに自分は「資格を取ろう」と思った日から一ヶ月後を受験日にしたので約一ヶ月勉強しました

で、勉強方法は Kindle を使って参考書を一冊購入してひたすらその参考書を勉強しました
購入した参考書はこちら

  • Linux教科書 LPIC レベル2 スピードマスター問題集 Version4.0対応

これを Kindle Store で購入しました
で、あとは Mac と iPhone と Nexus7 (Tablet) を使ってどこでも勉強してました

参考書を選択する際の大前提なのですが、現在 LPIC2 は Version4.0 になっているので、それに対応した参考書を選択しました
他に有名なアズキ本という赤い参考書があったのですが、自分はそれにせず問題ベースの参考書にしました
理由は特にないですが、資格の勉強をするときにとりあえず過去問をやりまくったほうが合格しやすいという個人的な傾向があったのでそうしました

この参考書自体を購入するのもおすすめですが、個人的にオススメの方法は Kindle 版を購入することです
Kindle 版を購入すれば本を持たなくていいし、スマホがあればどこでも勉強できるのでかなり勉強時間を有効的に使えます

最終的にこの参考書の LPIC201 の部分を

  • 100% 正解できるまで何回も問題を解く
  • 注釈部分を細く読んで覚える
  • 模擬試験も 100% になるまで解く

ということを繰り返しました
問題を 100% 解けるようになるのはあたりまえですが、注釈の説明にあるコマンドやオプションも覚えておくと更にテストでは楽になります
あとは少しだけ Web にある過去問とかを解きましたが無料の過去問だと Version4.0 に対応していなくてあまり参考にならなかったのでほぼやっていません

当日

受験日当日ですが、忘れずに持っていくものが 2 点あります

  • 免許書 (顔写真付きの身分証明書が他にあればそれでも OK)
  • パスポート (直筆サイン入りの証明書が他にあればそれでも OK)

これがないと受験できないので注意してください
特に 2 つ目の直筆サイン入りの証明書がないと受験できないので注意してください

受付

受付では名前を言って用意した身分証明書を見せれば OK です
あとは受験前に簡単なガイダンスと書類へのサインをするだけでした
なぜかサインした日付と受験後に終了した時刻もサインする必要がありました

そして、受付が完了するとサインペンとボードが渡されます
テスト会場へは基本的に何も持ち込むことができません (身分証明書だけ持ち込みます)
テスト中に何かメモしたい場合にはそのボードに書くと良いと思います
自分は特にボードは使いませんでしたが、自身がない問題の番号とかを書いておいてあとで見直すときに使ったりすると良いかもしれません

でも、CBT に見直し機能が付いているのでそれも必要ないかもしれません

試験

自分が受験した会場は個室というわけではなく他の人もいるテスト会場でした他の人とは 1 枚の壁というかパーティションで区切られているだけで、打鍵音やつぶやき声が普通に聞こえる環境でした

なので、部屋に消音用のヘッドホンが備え付けてあり音が気になる方はそれをつけてテストすると良いと思います
が、消音効果はあまりなく打鍵音とかは普通に聞こえてしまうので、完全に静かな状態にするのは難しいと思います

基本は CBT でパソコンでキーボードとマウスを使って解いていきます
全 60 問で 60 問目に「終了する」的なボタンが出るので、それを押すとテスト終了になります
テストを終了する前にもちろん見直しはできるので安心してください
見直しも終了して問題ない場合は「終了する」をドキドキしながら押してください
次の画面で合否が速攻で表示されます

試験後

合否が出たら試験は終了です
その後で CBT 上で簡単なアンケートが始まりますが、これは回答しなくても OK です
会場を出て、受付時にもらったボードとペンを受付に持っていけば終了です

試験終了時に再度サインをし、スコアレポートをもらって終了となります
ちなみに今回もらったスコアボードは以下の通りです

lpic_ret.jpg

各問題のどこで間違えたとかは教えてくれません
ジャンルごとに何パーセント正解したかだけレポートしてくれるようです

最後に

LPIC201 に合格したのでレポートを備忘録として残しておきました
細かい問題の内容は持ち帰れないので全く覚えていませんが、参考書の問題集にあった過去問的なやつが結構出てくる印象はあったので、問題集を解きまくるのは LPIC 合格への近道なような気がします

なぜか自分は 201 から受験したので今後 101, 102, 202, 30X を受験して行こうかなと思います

何はともあれ合格したのは良かったのですが、最終的に一番たいへんだったのが受験のためのアカウントの登録と申し込みだったというのが個人的な印象です

2016年11月25日金曜日

Arduino で HC-06 を使って Bluetooth Classic で通信させてみる

概要

HC-06 は Bluetooth Classic 用の通信モジュールです
まず初めにこのモジュールは国内での技適が取得できていない通信モジュールになります
今回は動作確認が目的で公共の場で試してはいないので、実際に使いたい場合は個別に技適を取得する必要があるので注意してください

HC-06 は Arduino のシリアルピンを使って動作させることができます

環境

  • Mac OS X 10.12.1
  • Arduino IDE 1.6.12
  • Arduino UNO

配線

配線は以下の通りです
動作確認のため 13pin を使って LED を接続しておきます
hc06_first_circuit.jpg

HC-06 側は

  • Arduino 3.3v -> HC-06 VCC
  • Arduino GND -> HC-06 GND
  • Arduino TX -> HC-06 RXD
  • Arduino RX -> HC-06 TXD

と配線します
LED 側は

  • Arduino 13pin -> 抵抗 1kΩ -> LED アノード
  • Arduino GND -> LED カソード

と配線します
配線するとすぐに HC-06 の電源が入り、内臓の LED が点滅します

スケッチ

HC-06 とはシリアルで通信を行います
シリアルで信号「1」を受け取ったときは 13pin に接続された LED を点灯させます
「0」を受け取ったときには LED を消灯させます 

int rsvData = 0;
int led = 13;

void setup() {
  pinMode(13, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  if (Serial.available() > 0) {
    rsvData = Serial.read();
    if (rsvData == '1') {
      digitalWrite(13, HIGH);
      Serial.println("LED on");
    } else if (rsvData == '0') {
      digitalWrite(13, LOW);
      Serial.println("LED off");
    }
    delay(100);
  }
}

Arduino を PC に接続したら Arudino IDE で書き込んでください

動作確認

今回は Android の Bluetooth Terminal というアプリを使います
起動したら右上のメニューから「Connect a deivce - Secure」を選択します

すると HC-06 が見つかると思うのでデバイスを選択して Android と接続します
接続に成功すると点滅していた HC-06 の LED が点灯に変わります

あとは、アプリ側で「1」or「0」を入力してみましょう
するとシリアル通信が始まって Arduino 側の 13pin に接続された LED を制御することができます
hc06_first_ret.jpg

接続を解除するには Bluetooth Terminal アプリを停止してください

最後に

Arduino で Bluetooth Classic のモジュール HC-06 を使ってみました
冒頭説明しましたが、HC-06 は技適のないモジュールなので注意してください

また、HC-06 は Bluetooth Classic 用の通信モジュールになります
Bluetooth Low Energy を実現するためのモジュールではないので、そこも注意してください
いろいろと違いはありますが、Bluetooth Classic は iOS だと API が提供されていないのでアプリから接続して動作確認できません
なので、今回動作確認は Android を使いました

2016年11月24日木曜日

The document Main.storyboard requires Xcode 8.0 or later

概要

Xcode8 で編集した Storyboard を Xcode7 で編集しようとするとタイトルのエラーが発生します
Xcode8 で再度編集できる環境があれば、Xcode8 で設定を直してから Xcode7 で開くことができます
が、Xcode7 しかない場合にはそもそも Storyboard ファイルを開くてことができないので設定を直すことができません

そんな場合の対応方法を紹介します

環境

  • Mac OS X 10.10.5
  • Xcode 7.2.1

対応方法

まず、Xcode7 でプロジェクトを開きます
そして、Main.storyboard で右クリックをし「Open As」->「Source Code」で Storyboard をコードとして開きます

xcode7_troble_shoot1.png

するとずらっーと XML が表示されるので以下の行を検索して手動で削除してください

<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>

結構 Storyboard のコード量が多いので、「Xcode 8」あたりで検索するといいと思います

そして削除したら一度プロジェクトを閉じましょう
再度プロジェクトを開いて Main.storyboard を今度は「Interface Builder - Storyboard」で開きます

するとエラーなく Storyboard が開けると思います

最後に

Xcode8 で編集した Storyboard を Xcode7 で開けるようにしてみました
そもそも Xcode8 でずっと編集できるのであれば、それのほうが良いと思います
たぶん、バージョンをまたいで開発するのは単純にあまりよくないと思います

2016年11月20日日曜日

ワイヤーストリッパーなしでジャンパケーブルやワイヤーの皮を剥く方法

概要

ワイヤーストリッパーとはケーブルの皮を剥いて銅線を露出させるための工具です

これを使うと簡単に皮を剥くことができます
今回はこのワイヤーストリッパーがないときにニッパとラジオペンチを代わりに使って皮を剥く方法を紹介します

環境

  • ニッパ
  • ラジオペンチ

剥く対象

今回はユニバーサル基板などで配線するときに使う「耐熱電子ワイヤー」を剥いてみました
peel_wire1.jpg

手順

まず左手にラジオペンチを持ちワイヤの残したい端の部分をはさみます
peel_wire2.jpg

そしてニッパの背中部分をピッタリとラジオペンチに合わせて右手で持ちますポイントは本当にピッタリとつけないうまく剥けません
peel_wire3.jpg

そして、右手のニッパを軽くワイヤーに挟んで手前だけテコの原理のようにして開きます
peel_wire4.jpg

左手のラジオペンチはしっかりと握りましょう
ラジオペンチの固定が弱いと開いた時にワイヤーがラジオペンチからスルスルと移動してしまいうまく剥けません
右手のニッパは握りすぎるとワイヤーが切れてしまいます
ワイヤーの皮の部分に軽く引っかかるくらいの力で握りましょう

ちゃんとラジオペンチ側とニッパ側でワイヤーが挟めていればあとはテコを利用して皮を剥くのでスルリと剥けると思います
peel_wire5.jpg

最後に

ワイヤーストリッパーなしでケーブルの皮を剥く方法を紹介しました
ポイントは右手と左手の力の入れようだと思います
力が強すぎるとケーブル中のメッキ線まで切ってしまうし、弱すぎると皮が剥けません
その辺の間隔は経験を重ねて覚えるしかないと思います

ワイヤーストリッパーがあれば簡単ですが、実はこの方法に慣れてしまうとこっちのほうが正確かつ素早くできる気がしなくもないです

2016年11月19日土曜日

Arduino Pro mini で Grove の水分センサを使ってみた

概要

Grove の水分センサ (Moisture Sensor) を Arduino Pro mini で使ってみました
アナログでセンサの値を取得するだけで使えます

環境

  • Mac OS X 10.12.1
  • Arduino IDE 1.6.12

配線

アナログピンに接続するだけなので簡単です
grove_moisture_sensor_circuit.jpg

FTDI のシリアル変換アダプタは 3.3v にしています
使用しているアナログピンは A0 を使用しました

スケッチ

こちらもアナログの値を読み込むだけなので簡単です

int sensorPin = A0;
int sensorValue = 0;

void setup() {
  Serial.begin(9600);
}
void loop() {
  sensorValue = analogRead(sensorPin);
  Serial.print("sensor = " );
  Serial.println(sensorValue);
  delay(1000);
}

動作確認

では、動作確認していきます
コップに水を汲んでテストしてみましょう
自宅の水道水だと以下のような値になりました
grove_moisture_sensor_ret1.png

値は 250 - 450 くらいの値で変化しています
水分センサの先っちょだけ浸すと 250 くらいでセンサ全体を浸すと 450 くらいになりました

何も水に浸していない状態だと 0 だったのでプルダウンしているんだと思います
そして、電気が通る水に浸すと電圧が発生してアナログとして読める感じです

で、せっかくなのでより電気を通すように塩を混ぜて食塩水にして計測してみました
結果は以下のとおりです
grove_moisture_sensor_ret2.png

想像していた通りというかやはりアナログの値は上がりました
なので、このセンサは電気抵抗が低いほど水に浸すほど値が上がるセンサだということがわかりました
なので、純水に浸しても抵抗が大きすぎるのでこのセンサでは値は取得できないと思います

最後に

Grove の水分センサを使ってみました
今回もベースシールドなしでやってみましたが、アナログピンをそのまま使うだけなので簡単でした

Grove 系のセンサはセンサ側で保護回路やプルダウン/アップがちゃんとされているので、使う側は本当に接続するだけで簡単に使えるのが嬉しいところおだと思います

一つ難点を上げるのであれば専用のコネクタを使用するのがデフォルトで DIP 基板等で使えません
なので、ブレッドボードやユニバーサル基板上で使えるようにするのが少し面倒な点かなと思います

参考リンク

2016年11月18日金曜日

firebase-admin を使ってサーバからデータベースを操作してみた

概要

Firebase へのデータの保存と取得をサーバサイドからやってみました
今回は公式の nodejs のライブラリを使って操作してみました

環境

  • Mac OS 10.12.1
  • nodejs 5.9.1
  • firebase-admin 4.0.2

認証情報の取得

Firebase にアクセスするための admin ユーザの認証情報を取得します
認証情報は各プロジェクトごとに割り当てられています
まず Firebase のコンソール画面から「権限」を選択します
firebase_admin_download_auth1.png

すると Google の IAM 管理の画面に移動するので左メニューからサービスアカウントを選択します
一覧の中に「firebase-adminsdk」というユーザがいるので、一番右のメニューから「鍵を作成」を選択します
firebase_admin_download_auth2.png

鍵のフォーマットを選択する画面になるので JSON を選択して鍵を生成します
すると認証情報が記載された json ファイルがダウンロードできます
firebase_admin_download_auth3.png

この json ファイルを使って Firebase に認証します

ライブラリのインストール

では、nodejs を使ってプログラミングしていきます
まずは公式が公開しているライブラリをインストールします

  • npm install firebase-admin --save

で OK です

初期化

まずは Firebase にアクセスするために認証情報を使って初期化します

var admin = require("firebase-admin");
var serviceAccount = require("./your-project-admin.json");

admin.initializeApp({
  credential: admin.credential.cert(serviceAccount),
  databaseURL: "https://your-db-id.firebaseio.com/"
});

var database = admin.database();

ダウンロードした認証情報のファイルを require で読み込みます
あとは initializeApp 関数を呼び出してデータベースを初期化します

以降は database オブジェクトを操作することでデータの読み書きを行います

データの保存

先ほどの初期化した処理の下にデータを保存する処理を追記しましょう
teamA/users というパスの配下にユーザを追加するような処理になっています

var ref = database.ref("teamA");                                                                                                  
var usersRef = ref.child("users");
usersRef.set({
  hawk: {
    age: 1,
    sex: "male"
  },
  snow: {
    age: 1,
    sex: "famale"
  }
});

実行して Firebase のコンソールでデータを確認すると以下のように表示されると思います
firebase_admin_saved_data.png

データの取得

続けて保存したデータを取得してみたいと思います
snapshot という単位で保存したデータを取得します
初期化のあとに以下を記載してください

var ref = database.ref("teamA");                                                                                                  
ref.on("value", function(snapshot) {
  console.log(snapshot.val());
}, function (errorObject) {
  console.log("The read failed: " + errorObject.code);
});

データが取得できると実行したコンソール画面に以下のように表示されると思います

{ users: 
   { hawk: { age: 1, sex: 'male' },
     snow: { age: 1, sex: 'famale' } } }

ちなみに、node を実行している状態でコンソールからデータを追加するとそのデータもリアルタイムで node 側にデータが表示されると思います
firebase_admin_push_data.png

{ users: 
   { hawk: { age: 1, sex: 'male' },
     log: { age: 2, sex: 'male' },
     snow: { age: 1, sex: 'famale' } } }

最後に

nodejs から Firebase へのデータの保存と取得を行ってみました
データベースは Firebase だと「Realtime Database」という位置づけになるので、取得などの処理は少し癖のある感じになっています

Websocket や MQTT のように一度コネクションを張れば基本はそのコネクションを使いまわしてデータの取得をリアルタイムに行っている感じだと思います

一応クエリやフィルタの概念はあるので検索やソートできると思います
その辺りも後で検証してみたいなとは思っています
あとはサーバサイドからの更新や削除もやってみようかなと思います

参考サイト

2016年11月17日木曜日

Arduino の Serial.write とうまく付き合う方法 (BLESerial2 編)

概要

Serial.write はArduino の TX ピンから信号を送信することができる命令です
同じような命令に print や println もあります
Serial.write は (特に何も指定しない場合) 1 byte の信号を送信することができます
今回は 1 byte 以上のデータを送信する場合や受取側で考慮するべき点について考えてみました
タイトルに BLESerial2 があるのはデータの受信と送信のデバッグに Bluetooth を使ったからです

環境

  • Arduino IDE 1.6.12
  • Arduino Pro mini (5v, 16MHz)
  • Mac OS X 10.10.5
  • Ruby 2.3.1p112

基本的な使い方

まず、1 byte の情報を送信する方法を考えます

Serial.write(1)

は数字の「1」を 1 byte 分送信します
送信する際はバイト配列として 16 進数に変換して送られるので「0x01」となります

この方法で他のデータを送信すると以下のようになります

  • 「8」・・・ 0x08
  • 「10」・・・ 0x0A
  • 「a」・・・ 0x0A (Serial.write(0x0A)) として送信
  • 「255」・・・ 0xFF
  • 「65535」・・・0xFF

ちなみにテストスケッチは以下の通り

void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.write(32767);  // ここの値を変更
  delay(2000);
}

255 までは 1 byte で収まる範囲になります
ただ、65535 は 2byte 必要になる情報です
これを wirte すると受け取ったときの情報は 255 のときと同様に「0xFF」になってしまいます
これは冒頭でも説明した用に Serial.write がデフォルトだと 1 byte の情報しか送信できないためです

本来なら 65535 は 0xFFFF として受け取りたいです

int (2byte) の情報を送信する方法

では、次に 65535 を送信する方法を考えます
手順としては以下順番で送信します

  1. 2byte のバイト配列に格納
  2. Serial.write の 2 つ目の引数にバイト配列のサイズを指定
  3. 2byte のバイト配列を送信

になります
スケッチにすると以下の通り

byte data[2];
data[0] = byte(65535);
data[1] = byte(65535 >> 8);
Serial.write(data, 2);

これで 0xFFFF を送信することができるようになりました
が、非常に面倒くさいです

もう少し簡単な方法で記載してみます
int 型の配列を作成して、その配列を最終的にバイトに変換することで送信してみます

int val = 65535;
int data[1];
data[0] = val;
Serial.write((byte*) data, 2);

どうでしょうか、これでも 0xFFFF が送信できたと思います
で、Arduino というか C 言語にある union を使って共用体を作成することでもう少し見やすいコードにすることができます

typedef union {
  int val;
  byte binary[2];
} u;

として共用体を作成し以下のように送信します

u u1;
u1.val = 65535;
Serial.write(u1.binary, 2);

これでも「0xFFFF」を送信することができます
こちらのほうがコード的には読みやすく良い感じになります

で、肝心なのは Serial.write で 1byte 以上のデータを送信するためには

  1. バイト配列を用意する
  2. 第二引数に送信するそのバイト配列のバイト数を指定する

という方法を取る必要があるということになります

float (4byte) の情報を送信する方法

では、今度は float のデータを送信してみましょう
Arduino UNO や Duo では float は 4byte として扱われます
先程 2byte を送信したときのやり方とほぼ同じです

まず float 用の共用体を定義します
ポイントとしては float は 4byte なので先程の int のときとは異なり 4byte 分のバイト配列を定義する必要があります

typedef union {
  float val;
  byte binary[4];
} uf;

これで送信する側で

uf uf1;
uf1.val = 1.0;
Serial.write(uf1.binary, 4);
delay(2000);

とすれば OK です
ちなみに float 型の 1.0 は 16 進数に直すと「0x0000803F」になります
ちょっと説明が遅れましたが、Arduino の場合ビッグエンディアンとして扱われるので変換するときは逆から読む必要があります

で、union を使わないで送信することもできます
これも動作を理解していれば簡単で float 型の配列を用意して、それをバイト変換した上で配列の長さ x 4 のバイトサイズを Serial.write してあげれば OK です

float val = 1.0;
float data[1];
data[0] = val;
Serial.write((byte*) data, 4);

これでも目的のデータを送信することができます

受取側での考慮

受取側はバイト配列としてデータが受け取れることを考慮する必要があります
なので、そのデータが int なのか float なのかはたまた文字列なのかによってデータをコンバートする方法が異なります

例えば今回の例でいうと「65535」は int ではありますが、unsigned int になります
つまり符号なしの 2byte 情報になります
それを受信側で変更すると (Ruby を使います)

s='0xFFFF'
v=[s.to_i(16)].pack('n').unpack('S')[0]

で 65535 が取得できます
これが間違えて unpack するときに「s (符号あり 2byte)」として受信してしまうと「-1」が取得できてしまいます

なので、受信側では送信側が何の型で送信したのかをちゃんと把握してからコンバートする必要があるということです

ついでに float もコンバートしてみましょう
float は符号ありの 4byte 情報になります
Ruby の unpack にはちょうど「f」という単精度浮動小数点数があるのでこれを使って

s='0x0000803F'
v=[s.to_i(16)].pack('N').unpack('f')[0]

とすることで目的の「1.0」を取得することができます
ちなみに pack('n')pack('N') の違いは 16bit or 32bit の違いでどちらもビッグエンディアンの情報を扱うときに使用する Array クラスの関数になります

JavaScript 版

ブラウザで 4byte の float 配列をコンバートする方法です
nodejs だと結構簡単にできるのですが、ブラウザのみだと難しかったのでメモしておきます

function toFloat(data) {
  splited = data.match(/.{2}/g);
  a = new Float32Array(
    new Uint8ClampedArray(
      splited.map(function(a){
        return parseInt(a, 16);
      })
    ).buffer
  );
  return a;
}

で以下のように呼び出すことで「1.0」を取得することができます

val = '0x0000803F'.toString(16).replace(/0x/, "").match(/../g).join("");
type = toFloat(val);
console.log(type);

最後に

Arduino の Serial.write で複数のバイト配列を送信するときのポイントを紹介しました
バイト配列を作るということとバイト数を指定するというポイントを抑えておけば基本は大丈夫だと思います
あとは、union を使うと少しは簡単になるということを覚えておくとよいと思います

そして、実は送信側よりも受信側でバイト配列をコンバートするほうが実はかなり大変だったりします
型を考えなければいけないのはもちろんですが、配列の長さごとに異なるデータが格納させている場合もあるので、その場合は配列を区切って処理する必要があります
例えば先頭 2byte は「タイプ」でその後の 4byte が「値」とかはケースとしてよくあると思います
しかもタイプと値とで型が違うとかは更にコンバートするときにややこしくなると思います
なので、送信する側は少し受信側のことを考えてから送信してあげると良いかと思います

参考サイト

2016年11月14日月曜日

Ruby で Firebase のデータベースにレガシーな方法でデータを保存してみた

概要

Ruby から Firebase のデータベースにデータを保存してしました
タイトルにある通りレガシーな方法を紹介します
レガシーというのは認証部分のことを指しており、今回紹介する方法は今後推奨されない方法、廃止される方法となる可能性が高いのでご注意ください 

環境

  • Mac OS X 10.10.5
  • Ruby 2.3.1p112
  • Gem 2.5.1
  • firebase 0.2.6

事前準備

Firebase へのプロジェクトの作成およびアプリケーションの作成は予め実施しておいてください
この記事内では過去に作成したアプリを使います

認証情報の取得

Ruby クライアントが使用する認証情報を取得します
この認証を使う方法がレガシーな方法になっています

作成したプロジェクトを開き

プロジェクトの設定 -> サービスアカウント -> データベースのシークレット -> シークレット -> 表示する

でシークレットキーを取得できるのでメモしておいてください

アクセスするとわかると思いますがここでも「データベースのシークレットは既に廃止されており、レガシーの Firebase トークン生成ツールを使用します。Firebase Admin SDK を使用してソースコードを更新してください。」と出て来ます
ruby_firebase_legacy_getting_secret.png

ベース URI の取得

各プロジェクトごとに割り当てられているデータベース用のベース URI を取得します
プロジェクトから左メニューの「データベース」を選択すると表示されるのでメモしておきます
ruby_firebase_legacy_getting_baseuri.png

データを保存するスクリプトの作成

取得した認証情報とベース URI を使用してスクリプトを作成します

  • bundle init
  • vim Gemfile
gem "firebase"
  • vim test.rb
require "firebase"

base_uri = 'https://your-project-id.firebaseio.com/test'
secret_key = 'your-secret-key'

firebase = Firebase::Client.new(base_uri, secret_key)

response = firebase.push("todos", { :name => 'Pick the milk', :priority => 1 })
puts response.success?
puts response.code
puts response.body
puts response.raw_body
  • bundle install
  • bundle exec ruby test.rb

で実行までできます
base_urisecret_key の部分は取得した情報を記載しましょう

動作確認

認証エラー等が出ないで 200 が返ってくればデータが保存されています
コンソールで Database を確認すると以下のように値が保存されているのがわかると思います
ruby_firebase_legacy_ret.png

最後に

Ruby で Firebase に値を保存してみました
取得する方法もあるのですが、クエリを使ってフィルタを掛けるのに苦戦しています、、、
こちらもわかったらポストしようかなと思います

あとは、認証方式も正式なやつを使った版を試してみようかなと思います

参考サイト

2016年11月13日日曜日

Arduino Pro mini で Grove の I2C センサを使ってみた

概要

Grove は seeed 社が提供するデバイスサービスで、ソケットに接続するだけで簡単にセンサなどを追加することができるサービスです
基本的に Arduino などで使用する場合は専用の Grove Arduino Bsae Shield などを使うのですが、Arduino Pro mini などにはありません
そうなるとセンサだけが残ってしまいもったいないです
なので、今回は Grove のセンサだけを Arduino Pro mini で使ってみました
今回使用した Grove カラーセンサ になります

環境

  • Mac OS X 10.10.5
  • Arduino IDE 1.6.12
  • Arduino Pro mini (5v, 16MHz)
  • Grove_I2C_Color_Sensor (rev d3b65e36de1693834a1b04b327fa588413cad0ce)

配線

配線は以下の通りです
FTDI のレギュレータは 5v にしています
promini_with_grove_sensor_circuit.jpg

ポイントは Grove のピンソケットに無理矢理 I2C 接続をジャンパケーブルを使って実現している点です
当たり前と言えば当たり前なのですが、I2C 接続用のセンサデバイスなので、Arduino Pro mini とも I2C で接続します
今回のカラーセンサの場合、センサに電源が入ると内臓の LED がピカーッと光ります (結構まぶしいです)

ライブラリのインストール

Arduino IDE のライブラリの管理からインストールできないので、zip ファイルをダウンロードしてインストールします

https://github.com/Seeed-Studio/Grove_I2C_Color_Sensor
から zip ファイルをダウンロードしましょう
そして Arduino IDE で

スケッチ -> ライブラリをインクルード -> .ZIP 形式のライブラリをインクルード

でインストールしましょう
特にエラーが出なければ OK です

スケッチ

では、スケッチを書きます
そんなに難しくはありません

#include <Wire.h>
#include <GroveColorSensor.h>

void setup() {
  Serial.begin(9600);
  Wire.begin();
}

void loop() {
  int red, green, blue;
  GroveColorSensor colorSensor;
  colorSensor.ledStatus = 1;
  while (1) {
    colorSensor.readRGB(&red, &green, &blue);
    delay(300);
    Serial.print("The RGB value are: RGB( ");
    Serial.print(red, HEX);
    Serial.print(", ");
    Serial.print(green, HEX);
    Serial.print(", ");
    Serial.print(blue, HEX);
    Serial.println(" )");
    colorSensor.clearInterrupt();
  }
}

readRGB に値を格納するポインタを引数に渡すとそのポイントに RGB 値を格納してくれます

動作確認

スケッチを書き込んでシリアルモニタを開いて動作確認してみましょう
白のものを近づけると以下のように FF (255) に近い値になります
逆に黒を近づけると 00 に近い値になると思います
promini_with_grove_sensor_ret.png

最後に

Arduino Pro mini で Grove のカラーセンサーを使ってみました
Grove は基本ベースボードを使って使うものだと思っていましたが、ベースボードがなくても使えることがわかりました
Grove のセンサには他にシリアル接続用のセンサやアナログ接続用のセンサがあります
今回は I2C 用のセンサを使ったので Aruduino Pro mini とも I2C 接続をしましたが、センサによっては接続するピンが変わってくるので注意してください

また、Grove の場合ライブラリも各センサごとに用意されているっぽいので、カラーセンサー以外を使う場合はそれ用のライブラリをインストールしてください

参考サイト

2016年11月12日土曜日

Arduino Pro mini で I2C 接続されたセンサデバイスから値を取得する方法

概要

過去に I2C 接続の高精度の温度センサ MCP9808 を Arduino Pro mini で使用してみました
そのときは専用のライブラリを使用して動作させました
今回は勉強のためライブラリを使わずに MCP9808 から値を取得してみました

環境

  • Mac OS X 10.10.5
  • Arduino IDE 1.6.12
  • Arduino Pro mini (5v, 16MHz)

配線

こちらと全く同じなので、参考に配線してください

I2C を一つ繋いでいるだけの配線なので簡単です

スケッチ

Wire.h というデフォルトで使用できる I2C 用のライブラリを使ってプログラミングします
setup で Wire.begin() するのを忘れないようにしましょう

#include <Wire.h>

void setup() {
  Wire.begin();
  Serial.begin(9600);
}

void loop() {
  uint16_t val;
  // デバイスのアドレスを指定
  Wire.beginTransmission(0x18);
  // 温度を管理しているアドレスを指定
  Wire.write((uint8_t) 0x05);
  Wire.endTransmission();
  Wire.requestFrom((uint8_t)0x18, (uint8_t)2);
  // 温度を取得して値をごにょごにょする (ライブラリがやっていることと同じことをやる)
  val = Wire.read();
  val <<= 8;
  val |= Wire.read();
  float temp = val & 0x0FFF;
  temp /= 16.0;
  // 出力
  Serial.println(temp);
  delay(500);
}

サンプルに記載されている通りですが、まず beginTransmission でデバイスとの接続を開始します
MCP9808 のデバイスアドレスは前回の I2C デバイスを検索する記事から「0x18」だとわかっています

ここのアドレスはデバイスごとに違うので各自の I2C デバイスに併せて変更してください

次に write 関数を使って取得したい値のアドレスを I2C デバイスに伝えます
I2C デバイスには値を管理するアドレスも振られており、今回取得したい温度 (摂氏) の情報は 0x05 で管理されています
この 0x05 はどうやって調べたかというと、今回はライブラリのコードを直接見ました

おそらく、デバイスの公式サイトにアドレス表があると思うので基本はそういった情報を参考にして探すと良いと思います

そしてその後で read 関数を使って温度の情報を取得してます
いろいろと取得した値をシフトレジストしたり論理積の計算をしたりしていますが、これも今回はライブラリでやっていることをそのまま実装しました

で、あとは結果を表示しているだけです

動作確認

配線したらスケッチを書き込んで動作確認してみましょう
今回の場合は以下のように温度情報が取得できると思います
mcp9808_only_wire_lib_ret.png

最後に

Wire ライブラリだけを使って I2C デバイスからセンサの値を取得してみました
今回は勉強目的で Wire ライブラリだけを使って取得したので基本はライブラリが存在するのであれば、それを使うのが良いと思います

もし専用のライブラリがないのであれば、今回の方法を使って最低限の情報は取得できるようになると思います
余裕があれば Wire.h を使ってライブラリを作って上げてしまうと更に良いかもしれません

参考サイト

2016年11月11日金曜日

ATTiny85 ライタをユニバーサル基板化した

概要

前回紹介した Arduino Pro mini で ATTiny85 にスケッチを書き込んでみた ですが、ブレッドボード上に毎回配線するのが面倒だったので、ユニバーサル基板上に実装してみました

環境

  • 抵抗 47Ω x 2
  • LED x 2
  • ユニバーサル基板 47 x 36 mm
  • メスピンソケット x 2
  • 電解コンデンサ 100μF
  • 8 ピンソケット
  • スズメッキ線
  • 耐熱電子ワイヤー

配線

完成図です
電源は Arduino Pro mini のシリアルから取得しています


attiny_writer_univeral_board1.jpg


attiny_writer_univeral_board2.jpg

合体版
attiny_writer_univeral_board3.jpg

感想

電解コンデンサで RST, GND を接続するところが完全にミスりました
GND 部分のスルーホールに 3 つの線をハンダ付けしたのですが、完全にハンダがモリモリ状態になってしまい、隣と合体してしまいました
そうして何度もハンダし直している間にかなり汚くなってしまいました

ちょうど、Arudino Pro mini のしたのユニバーサル部分が空いていたので、GND の線を伸ばして 1 つのスルーホールに 1 つの線をハンダするようにすればよかったかなと思います

とりあえずテストで ATTiny85 に書き込んでみましたが問題なく書き込めたので配線は問題なさそうです
書き込み後の ATTiny85 も問題なく動作しました

2 本だけ表部分にスズメッキ線が出てしまったので、その部分もちょっと反省点ではあります

まぁまぁとりあえずこれで ATTiny85 への書き込みはだいぶ楽になったでよかったです
今後は ATTiny85 用の配線をユニバーサル基板化したいなとか思っています

Tips

Arduino ISP のスケッチの書き込みは Arduino Pro mini はソケットに差し込む前に行ってください

逆にブートローダの書き込みと ATTiny85 へのスケッチの書き込みは Arduino Pro mini をソケットに差し込んでから行ってください

そうしないと Arduino IDE でエラーが発生します

2016年11月10日木曜日

Arduino Pro mini で I2C 接続されたデバイスを探す方法

概要

Arduino Pro mini に I2C 接続されたデバイスのアドレスを Wire ライブラリを使って探してみました
Arduino で I2C を使うには I2C ごとに固有に振られたアドレスがあり、それが必要だったので検索してみました

環境

  • Mac OS X 10.10.5
  • Arduino IDE 1.6.12
  • Arduino Pro mini (5v, 16MHz)

配線

前回使用した MCP9808 を使って探してみたいと思います
リンクを元に同じように配線してください

スケッチ

I2C デバイスを探すためのスケッチになります
書けたらスケッチを書き込んでみましょう

#include <Wire.h>

void setup() {
  Wire.begin();
  Serial.begin(9600);
  while (!Serial);
  Serial.println("\nI2C Scanner");
}

void loop() {
  byte error, address;
  int nDevices;
  Serial.println("Scanning...");
  nDevices = 0;
  for (address = 1; address < 127; address++ ) {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
    if (error == 0) {
      Serial.print("I2C device found at address 0x");
      if (address < 16) {
        Serial.print("0");
      }
      Serial.print(address, HEX);
      Serial.println("  !");
      nDevices++;
    } else if (error == 4) {
      Serial.print("Unknow error at address 0x");
      if (address < 16) {
        Serial.print("0");
      }
      Serial.println(address, HEX);
    }
  }
  if (nDevices == 0) {
    Serial.println("No I2C devices found\n");
  } else {
    Serial.println("done\n");
  }
  delay(5000);
}

動作確認

シリアルモニタを開いて確認すると以下のようにデバイスのアドレスが取得できるのがわかると思います
arduino_scan_i2c_devices.png

見つからない場合はずっと「Scannning…」で止まっています

最後に

Arduino Pro mini を使って I2C デバイスを検索する方法を紹介しました
検索するだけであれば、特にライブラリをインストールすることもなく簡単にできます

I2C デバイスを Aruduino で制御する場合大抵は専用のライブラリを使います
ただ、ライブラリをインストールしないでも標準の「Wire」というライブラリを使ってもアクセスすることができます

次回は、Wire.h だけを使って MCP9808 から温度情報を取得してみたいと思います

2016年11月9日水曜日

はじめてのユニバーサル基板入門

概要

初めてにしては難しい回路に挑んだと自分では思うのですが、過去に ESP-WROOM-02 を使ってエアコンを制御できるデバイスを作成しました
今回はこれをユニバーサル基板化してみました

環境

  • ハンダ: 白光 半田ゴテ レッド 40W No.502
  • ESP-WROOM-02
  • 抵抗 47kΩ x 2
  • 抵抗 470kΩ x 2
  • タクトスイッチ x 2
  • 赤外線 LED
  • NPN トランジスタ
  • メスピンソケット x 2
  • ユニバーサル基板 47x36mm

完成図

いきなりですが完成図は以下のような感じです
電源は ESP-WROOM-02 の microUSB を使って取るようにしています
これでだいたい 2 時間ほどかかりました


first_universal_board1.jpg


first_universal_board2.jpg

合体版
first_universal_board3.jpg

手順

簡単に自分がやった手順を記載しておきます
おそらく「これが一番いい」みたいな手順はなく自分が好きなようにやったらいいという感じだと思うので参考程度に見てもらえればと思います

1 各種部品を配置する

ユニバーサル基板上に部品を配置します
ハンダ付けするほうに足が飛び出すので、部品をハンダしやすいように足を折り曲げて固定します
今回は、写真の表にあるように部品を配置しました

でここが一番のポイントだと思います
この部品の配置は正直「センス」だと思います
自分も間隔で固定しました
その後ハンダ作業に入るのですが、部品の配置が悪いと今回の自分のように裏面がスパゲッティ状態になってしまいます
なので、センスではありますがちゃんと回路図を作成してなるべくジャンパ線が交差しないように部品を配置するほうがキレイになるしハンダ付けもしやすくなると思います

2 部品をとりあえずハンダ付けする

部品を固定するために先に部品のハンダ付けを行いました
折り曲げた足の部分にハンダ付けをしていきます
あまった足の部分はとりあえず残しておくと良いと思います
この後ジャンパ線を使って配線していくのですが、例えば隣のスルーホールに伸ばしたいときには余った足を使ってハンダすることができるので、ジャンパ線の節約にもなります

3 配線していく

今回はスズメッキ線と耐熱電子ワイヤーを使って配線していきました
まっすぐな部分はスズメッキ線を使い、交差する部分は耐熱電子ワイヤーを使いました
これも特に順番はないですが、今回であればタクトスイッチの配線をしてから、赤外線 LED の配線をしました
理由は単純にやりやすかったからです
もう少し言うとブレッドボード上での配線をより頭で理解しているほうがタクトスイッチだったので、そちらから行いました

配線するときに 1 つのスルーホールに 2, 3 つの線をハンダするケースが多々ありました
それが結構難しくハンダを当てると元あった部品が外れてしまったり、つけたい部品から手を離すと外れてしまったりと大変でした
片手にハンダごてを持ってもう片方にハンダを持ってやっていたので、ハンダ付けしたい部品を固定化できないとハンダ付けが難しかったです
うまく固定化できない場合は、一旦ハンダごて部品を抑えてからハンダをあててやったりしていたのですが、当てすぎて回りの部品のハンダまで溶かしたり、焦げたりしたのでやはり固定化できていないと辛いと思います

4 テストする

実際にちゃんと配線できているか確認します
全部配線できたあとに ESP-WROOM-02 にスケッチを書き込んでテストするのも良いですが、自分はタクトスイッチの配線ができた段階で一旦テストを行いました
そして、タクトスイッチの動作確認ができたあとで、赤外線 LED の配線をしてその後両方合わせたテストを行いました
状況によっては、配線 -> テスト -> 配線 -> テストみたいなことができない場合もあるかもしれませんが、できれば小さい回路ができたら一旦その回路のテストをしたほうが配線ミスにも早く気付けるので修正する箇所が小さくて済むと思います

感想とか Tips

実際やってみた感想ですがユニバーサル基板化してよかったかなと思います

そもそもユニバーサル基板化した理由なのですが、一番の理由は「勉強したかった、やってみたかった」という好奇心的な理由です
あとは小型化したかったというものあります
ブレッドボードを使うとどうしてもブレッドボードの大きさ以上は小さくできないので無駄なスペースが出来がちです
ユニバーサル基板だと自分の好きな大きさで配線できるので、小型化することができます

技術的な理由もあります
実はこのリモコンデバイス自体自宅で常設して使っていました
常設しているのにブレッドボードやワイヤジャンパを使っていたので、他の検証のときにそこで使っているパーツが使えないという状況が発生していました
なので、ユニバーサル基板化してパーツを検証に使えるようにしたかったというのも理由の一つです
あとは、ブレッドボード上の配線だとたまにパーツが外れてしまうので、それを修正するのが面倒だということもあったので、ユニバーサル基板化してハンダ付けすることで部品を取れなくしたという理由もあります

やった後で「こうしたほうが良かった」という点ですが、一番は部品の置き場所かなと思います
特にタクトスイッチの場所を変えたかったです
冒頭に完成図がありますが、よく見ると合体版でタクトスイッチが ESP-WROOM-02 の下に隠れてしまっているのがわかります
隠れている方のスイッチはエアコンを付ける方のスイッチになります
押せないことはないですが、非常に押しづらいので、タクトスイッチの場所は申し少し考えてから配線したかったと思います

あとは見えないですが、やっぱり裏側はキレイに配線したかったなと思います
耐熱電子ワイヤーがあったので、交差しまくりでも問題なかったのですが、できればスズメッキ線だけで配線したほうが、かさ張らないしキレイに見えるしよかったかなと思います

今回のユニバーサル基板には固定用の穴が 2 箇所ありました
この後はこの穴を使って箱を作ったり、見栄えを良くしようかなと思います

最後に

はじめて自分のデバイスをユニバーサル基板化してみました
ハンダ付けは経験がものをいう場合がほとんどなので、今後もハンダ付けレベルを上げるために積極的にユニバーサル基板化していきたいなと思いました

2016年11月8日火曜日

Arduino Pro mini で ATTiny85 にスケッチを書き込んでみた

概要

Arduino ISP というモードを使うと Arduino を AVR マイコンのライタにすることができます
今回は Arduino Pro mini を Arduino ISP モードにしてライタとし ATTiny85 に L チカのスケッチを書き込んでみました
これであたなも AVR マイコンデビューです

環境

  • Mac OS X 10.12.1
  • Arduino IDE 1.6.12
  • ATTiny85
  • Arduino Pro mini (5V, 16MHz)
  • Arduino Board for ATTiny 1.0.2
  • 電解コンデンサ 100μF 25V 85度

Arduino ISP モードにする

まずは Arduino Pro mini をライタにするために ISP モードにします
とは言ってもスケッチを書き込むだけです

ファイル -> スケッチの例 -> 11. Arduino ISP -> Arduino ISP

pro_mini_attiny85_write_isp_mode.png
でスケッチが開けます
開いたら Arduino Pro mini に書き込みましょう

今回は Arduino Pro mini なのでボード情報はそれに合わせましょう

  • ボード: Arduino Pro or Pro Mini
  • プロセッサ: ATmega328 (5V, 16MHz)

pro_mini_attiny85_write_port_info.png

問題なくスケッチが書き込まれば OK です
自分は特に問題なく書き込めました

※一点注意として Arduino ISP を書き込むときはライタ用の配線から一旦外してから書き込んでください
そうしないと「avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x00」となりエラーとなります

ATTiny に書き込めるようにボード情報をダウンロードする

書き込み先に ATTiny が指定できるようにボード情報をダウンロードします

Arduino -> Preferences -> 追加のボードマネージャの URL

pro_mini_attiny85_write_preferences.png

で以下の json の URL を追記します

https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json

pro_mini_attiny85_write_add_url.png

追加できたら OK としてダイアログを閉じます
続けてツールバーから

ツール -> ボード -> ボードマネージャ

を開きます
ダイアログが表示されたら「ATTiny」で検索してボードをインストールしましょう
「Davis A. Mellis」さんが作成したボードをインストールすれば OK です
pro_mini_attiny85_write_install_board.png

問題なくインストールできればボードの一覧に ATTiny のボードが追加されています
今回インストールした 1.0.2 というバージョンだと以下のようにボードの種類がある程度まとめられてインストールされました
pro_mini_attiny85_write_boards_check.png

配線

では ATTiny にスケッチを書き込むための配線をしていきます
ICSP という SPI 通信を使った配線をします
pro_mini_attiny85_circuit1.jpg

反対側から
pro_mini_attiny85_circuit2.jpg

ちょっとややこしいので文字にすると以下の通り

  • Arduino 13 Pin -> ATTiny Pin 2
  • Arduino 12 Pin -> ATTiny Pin 1
  • Arduino 11 Pin -> ATTiny Pin 0
  • Arduino 10 Pin -> ATTiny Reset
  • Arduino VCC -> ATTiny VCC
  • Arduino GND -> ATTiny GND
  • Arduino RST -> Arduino GND (電解コンデンサー 100μF)

が基本的な配線です
ATTiny85 のピン配列はこちら を御覧ください
配線の写真だとわかりづらいですが、表面の隅っこに丸ポチがあるので、それを上にして (写真だと Arduino Pro mini に向けて) ピン配列を見てください

今回は Arduino 7, 9 ピンに LED を追加しています
ここに LED を挿しておくと書き込んでいる状況がわかるのでいいと思います
一応 1kΩ の抵抗をプルダウンで接続しています
接続すると 9 ピン側 (写真だと赤色 LED) は L フワしています

そして一番のポイントだったのですが、Arduino Pro mini の RST <-> GND 間に電解コンデンサを挟んでください
これを行わないと自分の場合

stk500_getparm(): (a) protocol error, expect=0x14, resp=0x14

※一部抜粋
というエラーが出て書き込みが行えませんでした
ちょっと写真だとわかりづらいですが、カソード (電解コンデンサにマイナスマークが書いてある方) を GND に接続してください
電解コンデンサは 10μF とかの容量でも全然大丈夫です
セラミックコンデンサの容量で動くかどうかは確認していません

回路図

P.S 20161128
fritzing で回路図を書いたので追加しておきます
attiny_writer_circuit.png

いざ書き込み

配線できたらスケッチを書き込んでみます
今回は Arduino の Blink を使います
スケッチの例から「Blink」を選択しましょう
そのままだと LED_BUILTIN が 13 ピンの制御になってしまっているのでそこだけ 0 に書き換えます
不要な部分を削除すると以下のスケッチになると思います

void setup() {
  pinMode(0, OUTPUT);
}

void loop() {
  digitalWrite(0, HIGH);
  delay(1000);
  digitalWrite(0, LOW);
  delay(1000);
}

Blink であれば ATTiny85 でも動作します (関数が完全に Arduino 互換ではないので使えない関数もあります)

で、ここがちょっとポイントですがツールからボードの設定を ATTiny 用にします
設定する箇所は以下の 4 つです

  • ボード: ATtiny25/45/85
  • プロセッサ: ATtiny85
  • Clock: Internal 8 MHz
  • 書込装置: Arduino as ISP

pro_mini_attiny85_config_board.png

特にポイントなのは書き込み装置の部分でここに ISP モード化した Arduino Pro mini を指定することになります
設定できたら書き込みを行ってみましょう
まず「ブートローダを書き込む」を実行します
Arduino IDE 上にエラーが表示されず問題なく書き込まれば OK です

続けてスケッチを書き込んでください
こちらも問題なく書き込めれば OK です

動作確認

念のため動作確認してみました
ATTiny85 の Pin0 で L チカできれば OK です
電源確保が面倒だったので Arduino Pro mini の VCC と GND から取得しています

pro_mini_attiny85_ret_attiny85.jpg

写真ですが、黄色の LED がチカチカしています
ちなみに Pin0 は写真向かって一番右下のピンになります

最後に

Arduino Pro mini を ATTiny85 等の 8 ピンの AVR マイコンのライタにしてみました
今後はこれをライタ専用機にしてもいいかもしれません

今回一番のポイントだったのは Arduino Pro mini の RST, GND 間の電解コンデンサでした
これがないとエラーとなり書き込めませんでした

とりあえずこれで AVR マイコンデビューができました
同じように 16 ピンや 24 ピンの AVR マイコンも ICPS を使えば Arduino as ISP を使えば書き込めると思います
ATTiny85 のピンも I2C やアナログリードなどはできるので、Arduino の代わりに ATTiny を使ってみてはいかがでしょうか

参考サイト

2016年11月5日土曜日

Arduino で MCP9808 (高精度温度センサ) を使ってみた

概要

Arduino で高精度の温度センサを使ってみました
Adafruit の Arduino 用の専用のライブラリがあるのでそれを使って I2C 接続で温度を取得することができます

環境

ライブラリのインストール

Arduino IDE からライブラリをインストールします
「MCP9808」と検索すれば出てくると思います
mcp9808_lib_install.png

配線

今回 Arduino Pro mini を使っているので事前に A4, A5 ピンにピンヘッダをつけておいてください
Arduino UNO であればそのまま A4, A5 ピンを使えば I2C 用のピンとして使えるので特に何もする必要はありません
mcp9808_circuit.jpg

電源電圧は 5V を使うので FTDI の変換アダプタのショートピンは 5V のほうにしておいてください
配線は以下の通りです

  • MCP9809 Vdd -> Arduino VCC
  • MCP9809 Gnd -> Arduino GND
  • MCP9809 SCL -> Arduino A5
  • MCP9809 SLA -> Arduino A4

スケッチ

ライブラリを読み込んで使います
I2C に接続されているデバイスを探して見つかれば readTempC で温度を読み込みます
値は摂氏で取得できるので華氏として表示するのであれば計算して変換してあげる必要があります

#include <Wire.h>
#include "Adafruit_MCP9808.h"

Adafruit_MCP9808 tempsensor = Adafruit_MCP9808();

void setup() {
  Serial.begin(9600);
  Serial.println("MCP9808 demo");
  if (!tempsensor.begin()) {
    Serial.println("Couldn't find MCP9808!");
    while (1);
  }
}

void loop() {
  Serial.println("wake up MCP9808.... ");
  tempsensor.shutdown_wake(0);
  float c = tempsensor.readTempC();
  float f = c * 9.0 / 5.0 + 32;
  Serial.print("Temp: "); Serial.print(c); Serial.print("*C\t");
  Serial.print(f); Serial.println("*F");
  delay(250);
  Serial.println("Shutdown MCP9808.... ");
  tempsensor.shutdown_wake(1);
  delay(2000);
}

動作確認

スケッチを書き込んで動作確認してみましょう
以下のように表示されると思います
mcp9808_ret.png

最後に

Arduino で MCP9808 を使ってみました
I2C のインタフェースがセンサ側にあるので非常に簡単に使えました
Arduino の I2C を使ったことがある方は非常に簡単に使えると思います
ポイントとしては 5V 駆動な点と Arduino Pro mini の場合には A4, A5 のはんだが必要というくらいだと思います

参考サイト