Arduino Yun cheat sheet: Difference between revisions

 
(103 intermediate revisions by the same user not shown)
Line 27: Line 27:


回路図も微妙に違うような...
回路図も微妙に違うような...
'''朗報! Two Arduinos Become One [http://www.arduino.org/blog/two-arduinos-become-one http://www.arduino.org/blog/two-arduinos-become-one]'''
'''おや! LLC 版の Yún が変わった [https://www.arduino.cc/en/Main/ArduinoBoardYun Arduino Yún LininoOS]'''
:2016年12月2日にウェブサイトが更新された模様。SRL と LLC 和解の成果か。
::2014年10月以降に出荷された Yún は LininoOS だったと。(歴史改ざんしてる気がするwww)
::おそらく(大人の事情で) LLC で Yún の出荷がとまった(Web から消えた)のが 2014年10月ごろか...
::その後 LLC では Yún Shield なる製品が出荷されて LininoOS ではなく OpenWrt-Yun が載ってたはず。
::この Yún Shield も(大人の事情で)出荷がとまった(Web から消えた)が、現在は出荷されている。技適とれてないので日本では触れない。
:::なので'''本サイトの以下↓の情報は古い'''です。(LEDE + Arduino-OS + Ciao のファーム作るか...)
::::[[#Arduino_Y.C3.BAn_LininoOS_.E5.B7.AE.E5.88.86|差分を追っかけてみる]]


== 諸注意 ==
== 諸注意 ==
Line 36: Line 47:
ソフトウェアの情報は LLC に合わせている。
ソフトウェアの情報は LLC に合わせている。


Arduino Yun の面白さ(逆に難しさ)はマイコン屋の知識と、UNIX屋・ネットワーク屋の知識と、Web屋の知識がすべて必要なところ。それぞれの専門家からみたら他方はブラックボックスに見えて理解に妨げになっているようだ。Arduino Yun の使い方・付き合い方は多方面から見てあげることが大切だ。
Arduino Yun の面白さ(逆に難しさ)はマイコン屋の知識と、UNIX屋・ネットワーク屋の知識と、Web屋の知識がすべて必要なところ。それぞれの専門家からみたら他方はブラックボックスに見えて理解の妨げになっているようだ。Arduino Yun の使い方・付き合い方は多方面から見てあげることが大切だ。


= 導入 =
= 導入 =
Line 51: Line 62:
micro-USB ケーブルには充電専用というのが紛れ込んでいるので要注意。
micro-USB ケーブルには充電専用というのが紛れ込んでいるので要注意。


紐をほどくために Arduino Leonardo ガイドの日本語訳
紐ほどくために Arduino Leonardo ガイドの日本語訳
  [http://trac.switch-science.com/wiki/Guide/ArduinoLeonardo Guide/ArduinoLeonardo – スイッチサイエンス]
  [http://trac.switch-science.com/wiki/Guide/ArduinoLeonardo Guide/ArduinoLeonardo – スイッチサイエンス]


ハードウェアの構成が異なるので微妙に Leonardo とも異なってるが、ほぼ同様とはいえる。
ハードウェア構成が違うので Leonardo とも微妙な差異があるが、ほぼ同様とはいえる。


== OpenWrt WiFi 設定 ==
== OpenWrt WiFi 設定 ==
Line 74: Line 85:
  [http://www.eleki-jack.com/FC/2015/11/arduino-yun5.html Arduino YUNを使ってみる(5) - フィジカル・コンピューティング]
  [http://www.eleki-jack.com/FC/2015/11/arduino-yun5.html Arduino YUNを使ってみる(5) - フィジカル・コンピューティング]


'''メモ''' : 初期パスワードは '''arduino''' (ちなみに Linino の場合は '''doghunter''')
'''メモ''': 初期パスワードは '''arduino''' (ちなみに Linino の場合は '''doghunter''')


'''注意''':開発環境が Windows の場合は [https://support.apple.com/kb/DL999?viewlocale=ja_JP&locale=ja_JP Apple から Bonjour のドライバー]をとってきてインストールしておく。
'''注意''': 開発環境が Windows の場合は [https://support.apple.com/kb/DL999?viewlocale=ja_JP&locale=ja_JP Apple から Bonjour のドライバー]をとってきてインストールしておく。


'''注意''':WiFi ルーターが「アイソレーション」「ネットワーク分離機能」「プライバシーセパレータ」等の名前の端末間通信を拒否する設定になっていると同一ネットワークに有る機器は Yun (OpenWrt) に接続できない。WiFi ルーターの該当を機能を解除する事。
'''注意''': WiFi ルーターが「アイソレーション」「ネットワーク分離機能」「プライバシーセパレータ」等の名前の端末間通信を拒否する設定になっていると同一ネットワークに有る機器は Yun (OpenWrt) に接続できない。WiFi ルーターの該当を機能を解除する事。


'''重要''': '''TIMEZONE は正しく設定する事(Asia/Tokyo)。'''でないと技適的にまずいはず...
=== ネットワーク設定に失敗したら ===
=== ネットワーク設定に失敗したら ===
AR9331 OpenWrt のシリアルコンソールを使って設定を修正する。
AR9331 OpenWrt のシリアルコンソールを使って設定を修正する。
Line 114: Line 126:
WiFi の設定を解除して有線に変えるとか、PPPoE とかの詳細設定は LuCI とよばれる GUI で行う。
WiFi の設定を解除して有線に変えるとか、PPPoE とかの詳細設定は LuCI とよばれる GUI で行う。


"board configuration", "wireless parameters" and "advanced configuration panel (luci)"
Arduino Webpanel にログインして、上部にある "CONFIGURE" ボタンを押して次のページに遷移し、そのページの上部にある、
advanced configuration panel (luci)
のリンクをクリックする。OpenWrt の LuCI で設定する。


== OpenWrt-yun のアップデート ==
 
Yun は WiFi ルータでよくつかわれている AR9331 を使用しており、かつ OpenWrt なので、WiFi ルータとしても十分つかえる。
 
== OpenWrt-Yun のアップデート ==
Arduino LLC 純正システムイメージ: [https://www.arduino.cc/en/Main/Software Other Software, ARDUINO YÚN LINUX OS OPENWRT-YÚN]
Arduino LLC 純正システムイメージ: [https://www.arduino.cc/en/Main/Software Other Software, ARDUINO YÚN LINUX OS OPENWRT-YÚN]


Line 123: Line 140:
</syntaxhighlight>
</syntaxhighlight>


'''注意''' : '''すべての設定やデータが消えます。'''
'''注意''' : '''すべての設定やデータが消えます。'''(luci の backup / restore を使う方法もあり)


'''注意''' : '''アップデート後、もういちどWiFiの設定を最初からやり直す事。'''
'''注意''' : '''アップデート後、もういちどWiFiの設定を最初からやり直す事。'''
Line 180: Line 197:
(echo o; echo n; echo p; echo 1; echo; echo +15G; echo n; echo p; echo 2; echo; echo; echo t; echo 1; echo c; echo w) | fdisk /dev/sda
(echo o; echo n; echo p; echo 1; echo; echo +15G; echo n; echo p; echo 2; echo; echo; echo t; echo 1; echo c; echo w) | fdisk /dev/sda
mkfs.vfat /dev/sda1
mkfs.vfat /dev/sda1
# mkfs.fat /dev/sda1
mkfs.ext4 /dev/sda2
mkfs.ext4 /dev/sda2
mkdir -p /mnt/sda2
mkdir -p /mnt/sda2
Line 243: Line 261:
#WiFi ボードをリセットするには、USB-A ポートの横にある "WLAN RST" を押す。
#WiFi ボードをリセットするには、USB-A ポートの横にある "WLAN RST" を押す。
#WiFi 設定を初期化するには、"WLAN RST" を 5 秒以上かつ 30 秒以下押し続ける。AR9331 がリスタートして 初期のWiFi設定モードになる。
#WiFi 設定を初期化するには、"WLAN RST" を 5 秒以上かつ 30 秒以下押し続ける。AR9331 がリスタートして 初期のWiFi設定モードになる。
#OpenWrt-Yun を工場出荷の状態に戻すには、"WLAN RST"を 30 秒以上押し続ける。この場合すべての設定が初期化される。
#OpenWrt-Yun を工場出荷の状態(正確には最後に導入した OpenWrt-Yun)に戻すには、"WLAN RST"を 30 秒以上押し続ける。この場合すべての設定が初期化される。
#:micro SD を使って Overlayfs で拡張している場合は micro SD を安全に抜いておく。
#:micro SD を使って Overlayfs で拡張している場合は micro SD を安全に抜いておく。
#::/etc/config/fstab の 該当の config 'mount' セクションを削除して micro-SD のファイルシステムを umount し micro-SD カードを抜く。
#::/etc/config/fstab の 該当の config 'mount' セクションを削除して micro-SD のファイルシステムを umount し micro-SD カードを抜く。
Line 282: Line 300:


例の 1200bps でリセットするところでこける。
例の 1200bps でリセットするところでこける。
:私の作業環境が Windows の Cygwin なので、新しく接続された USB デバイスを Cygwin 側からは認識しないという事情によるものだった。
:私の開発環境が Windows の Cygwin なので、新しく接続された USB デバイスを Cygwin 側からは認識しないという事情によるものだった。
:あとは 上記と同様な理由で、割り込み禁止にしているか、SLEEP_MODE_PWR_DOWN 等では USB シリアルは使えない。TCP/IP ネットワーク経由(AR9331 OpenWrt を AVR ライタとして使う)で使う方法/パッチ探すことにする...
:あとは 上記と同様な理由で、割り込み禁止にしているか、SLEEP_MODE_PWR_DOWN 等では USB シリアルは使えない。TCP/IP ネットワーク経由(AR9331 OpenWrt を AVR ライタとして使う)で使う方法/パッチ探すことにする...


Line 510: Line 528:


  [http://xx-prime.hatenablog.com/entry/2015/04/26/224618 Arduino yunで放射線センサのデータをxivelyとM2Xにアップロードする - XX-Prime's blog]
  [http://xx-prime.hatenablog.com/entry/2015/04/26/224618 Arduino yunで放射線センサのデータをxivelyとM2Xにアップロードする - XX-Prime's blog]
  [http://qiita.com/kassy_kz/items/ebeda9bcda444cf401a0 IFTTTを用いてArduinoからツイートする - Qiita]
  [http://qiita.com/kassy_kz/items/ebeda9bcda444cf401a0 IFTTTを用いてArduinoからツイートする]
  [https://github.com/itman83/ArduinoYun https://github.com/itman83/ArduinoYun]
  [https://github.com/itman83/ArduinoYun https://github.com/itman83/ArduinoYun]


Line 557: Line 575:
{
{
   uint8_t sreg = SREG;
   uint8_t sreg = SREG;
   noInterrupts(); // Protect from a scheduler and prevent transactionBegin                                                  
   noInterrupts(); // Protect from a scheduler and prevent transactionBegin
   if (!initialized) {
   if (!initialized) {
     // Set SS to high so a connected chip will be "deselected" by default                                                    
     // Set SS to high so a connected chip will be "deselected" by default
     uint8_t port = digitalPinToPort(SS);
     uint8_t port = digitalPinToPort(SS);
     uint8_t bit = digitalPinToBitMask(SS);
     uint8_t bit = digitalPinToBitMask(SS);
     volatile uint8_t *reg = portModeRegister(port);
     volatile uint8_t *reg = portModeRegister(port);


     // if the SS pin is not already configured as an output                                                                  
     // if the SS pin is not already configured as an output
     // then set it high (to enable the internal pull-up resistor)                                                            
     // then set it high (to enable the internal pull-up resistor)
     if(!(*reg & bit)){
     if(!(*reg & bit)){
       digitalWrite(SS, HIGH);
       digitalWrite(SS, HIGH);
     }
     }


     // When the SS pin is set as OUTPUT, it can be used as                                                                  
     // When the SS pin is set as OUTPUT, it can be used as
     // a general purpose output port (it doesn't influence                                                                  
     // a general purpose output port (it doesn't influence
     // SPI operations).                                                                                                      
     // SPI operations).
     pinMode(SS, OUTPUT);
     pinMode(SS, OUTPUT);


     // Warning: if the SS pin ever becomes a LOW INPUT then SPI                                                              
     // Warning: if the SS pin ever becomes a LOW INPUT then SPI
     // automatically switches to Slave, so the data direction of                                                            
     // automatically switches to Slave, so the data direction of
     // the SS pin MUST be kept as OUTPUT.                                                                                    
     // the SS pin MUST be kept as OUTPUT.
     SPCR |= _BV(MSTR);
     SPCR |= _BV(MSTR);
     SPCR |= _BV(SPE);
     SPCR |= _BV(SPE);
Line 589: Line 607:
</syntaxhighlight>
</syntaxhighlight>
で RX LED が付きっぱなしの条件でも RX LED は消灯することができる。
で RX LED が付きっぱなしの条件でも RX LED は消灯することができる。
ちなみに、複数の SPI デバイスを使う場合は、SPI Library で初期化する前に、すべての SPI デバイスの CS を必ず HIGH にしておくこと。
<syntaxhighlight lang="cpp" enclose="div">
/* Prepare for using multiple SPI devices */
pinMode(SPI1_CS, OUTPUT);
digitalWrite(SPI1_CS, HIGH);
pinMode(SPI2_CS, OUTPUT);
digitalWrite(SPI2_CS, HIGH);
/* Init SPI lib */
SPI.begin();
</syntaxhighlight>


== DS3234 の SQW と Alarm ==
== DS3234 の SQW と Alarm ==
Line 799: Line 829:
<syntaxhighlight lang="bash" enclose="div">
<syntaxhighlight lang="bash" enclose="div">
opkg install dosfsck
opkg install dosfsck
# opkg install dosfstools
umount /dev/sdb1
umount /dev/sdb1
dosfsck -t -a -w /dev/sdb1
dosfsck -t -a -w /dev/sdb1
# fsck.fat -t -a -w /dev/sda1
/sbin/block mount
/sbin/block mount
</syntaxhighlight>
</syntaxhighlight>
Line 880: Line 912:


== python beaver ==
== python beaver ==
logstash に計測データを送るために、軽量 shipper beaver を導入。
ELK stack / Elastic Stack (Logstash + Elasticsearch + Kibana) に計測データを送るために、軽量 shipper beaver を導入。もちろん経路の安全性や接続先の厳密化のために '''SSH Tunneling''' を使用する。
:本当は filebeat が良いのだが、Golang が MIPS に対応してない。
:本当は filebeat が良いのだが、Golang が MIPS に対応してない。
導入する前に micro-SD でディスク容量を増やしておく事。
導入する前に micro-SD でディスク容量を増やしておく事。
Line 890: Line 922:
easy_install pip
easy_install pip
opkg install python-sqlite3
opkg install python-sqlite3
pip install beaver==36.1.0
pip install beaver==36.2.0
</syntaxhighlight>
</syntaxhighlight>


SSH Tunneling したいので OpenWrt-Yun の 軽量 ssh である Dropbear SSH のための key 変換ツール。これで Dropbear 用に変換する。
SSH Tunneling の設定するため OpenWrt-Yun の 軽量 ssh である Dropbear SSH のための key 変換ツール。これで Dropbear 用に変換する。
<syntaxhighlight lang="bash" enclose="div">
<syntaxhighlight lang="bash" enclose="div">
opkg install dropbearconvert
opkg install dropbearconvert
Line 914: Line 946:


いろいろ設定して意外とさっくり supervisord 配下で beaver が動いた。
いろいろ設定して意外とさっくり supervisord 配下で beaver が動いた。
:ついでに ssh tunnel も稼働中...
:ついでに、外部からの接続用 ssh tunnel も稼働中...


init script で ssh を起動する場合、 HOME が設定されていないので、ssh 関連のファイルの操作ができない。
init script で ssh を起動する場合、 HOME が設定されていないので、ssh 関連のファイルの操作ができない。
Line 929: Line 961:
python supervisor と beaver を稼働させるともちろんメモリーは圧迫されるので無駄をなくす事が重要。
python supervisor と beaver を稼働させるともちろんメモリーは圧迫されるので無駄をなくす事が重要。
本当は OpenSSH client インストールして ssh tunnel のいろんなオプションつけたいのだけど我慢。ntpd も同様。
本当は OpenSSH client インストールして ssh tunnel のいろんなオプションつけたいのだけど我慢。ntpd も同様。
:最終的に OpenSSH-client は入れた。
:(最終的には、ExitOnForwardFailure=yes が必要だったので OpenSSH-client は入れた。)


<syntaxhighlight lang="bash" enclose="div">
<syntaxhighlight lang="bash" enclose="div">
Line 939: Line 971:
</syntaxhighlight>
</syntaxhighlight>
python supervisor と beaver を稼働させた状態。
python supervisor と beaver を稼働させた状態。
ちなみに、AR9331 は MIPS 24Kc で FPU は無し。


== メンテ用トンネル ==
== メンテ用トンネル ==
Line 990: Line 1,024:


自分の公開キーを書いておく。
自分の公開キーを書いておく。
= Yun を 無線(Wi-Fi) 有線(Ethernet) コンバータとして使う =
[https://lede-project.org/docs/user-guide/relay_configuration Wifi Extender or Repeater or Bridge Configuration]
[https://wiki.openwrt.org/doc/recipes/relayclient Routed Client with relayd (Pseudobridge)]
[http://ultimania.org/trac/yuna/wiki/linux/OpenWrt2 http://ultimania.org/trac/yuna/wiki/linux/OpenWrt2]
<syntaxhighlight lang="bash" enclose="div">
opkg update
opkg install relayd
opkg install luci-proto-relay
/etc/init.d/relayd enable
/etc/init.d/relayd start
</syntaxhighlight>
Luci 使えば簡単だった。
↓は LEDE 公式資料なので IF 名が Yun と違うので注意。(Yun は wan が eth1、lan が wifi)
[https://lede-project.org/_media/docs/guide-user/wifirepeater_interfaces_lan.png https://lede-project.org/_media/docs/user-guide/wifirepeater_interfaces_lan.png]
[https://lede-project.org/_media/docs/guide-user/wifirepeater_newinterface.png https://lede-project.org/_media/docs/user-guide/wifirepeater_newinterface.png]
[https://lede-project.org/_media/docs/guide-user/wifirepeater_relaybridge1.png https://lede-project.org/_media/docs/user-guide/wifirepeater_relaybridge1.png]
[https://lede-project.org/_media/docs/guide-user/wifirepeater_relaybridge2.png https://lede-project.org/_media/docs/user-guide/wifirepeater_relaybridge2.png]
[https://lede-project.org/_media/docs/guide-user/wifirepeater_firewall.png https://lede-project.org/_media/docs/user-guide/wifirepeater_firewall.png]
↓を再度確認のこと。(Yun は wan が eth1)
eth1 に ダミーの IP を振る。
<syntaxhighlight lang="text" enclose="div">
config interface 'wan'
        option ifname 'eth1'
        option proto 'static'
        option ipaddr '192.168.2.1'
        option netmask '255.255.255.0'
       
config interface 'repeater_bridge'
        option proto 'relay'
        list network 'lan'
        list network 'wan'
</syntaxhighlight>
最後に relayd を restart
<syntaxhighlight lang="bash" enclose="div">
/etc/init.d/relayd restart
</syntaxhighlight>
relayd の '-I' オプションは ARP cache を頻繁に行うようで気持ち悪い '-i' に変えてみた。が、動かなかった。'-I' に戻した。
最終的に ARP storm 問題が気になったので、いろいろ試したが解決せず、relayd を使わずに、静的な bridge 構成にした。
bridge しているインターフェースには proxy_arp を有効にすること。


= Security =
= Security =
[http://hackaday.com/2016/11/11/arduworm-a-malware-for-your-arduino-yun/ ArduWorm: A Malware for Your Arduino Yun]
:あーーー出てしまった...
::ATmega32u4に侵入して、bridge でお好きに的...
Arduino Yun の OpenWrt と AVR の脆弱性(要 Flash Plugin):
Arduino Yun の OpenWrt と AVR の脆弱性(要 Flash Plugin):
  [https://prezi.com/ufthiwidvb_0/tfm-arduino-yun-security-iot/ TFM - Arduino Yun - Security IoT]
  [https://prezi.com/ufthiwidvb_0/tfm-arduino-yun-security-iot/ TFM - Arduino Yun - Security IoT]
Line 1,024: Line 1,111:


Update ヲタクとして作業中: [http://www.egrep.jp/wiki/index.php/OpenWrt_for_Arduino_Yun_cheat_sheet OpenWrt for Arduino Yun Security Upgrade]
Update ヲタクとして作業中: [http://www.egrep.jp/wiki/index.php/OpenWrt_for_Arduino_Yun_cheat_sheet OpenWrt for Arduino Yun Security Upgrade]
= Arduino Yún LininoOS 差分 =
*Arduino LLC 版 Arduino IDE で「ライブラリを管理...」から MCU 側の Ciao Library がインストールできるようになっていた。
*Bridge Library か Ciao Library かは選択可能のように記述されている。(どちらか推奨があるわけではないみたい)
*luci-app-arduino-webpanel (Linino 版) と Arduino-OS (arduinoos) かはこれも様子見っぽい。Arduino-OS は野心的なので安定するまでは様子見したほうがよさげ。
*LininoIO はまだ水面下っぽい。(MCUIO driver 系) コンセプトは素晴らしいが、vanilla kernel に取り込まれる勢いで OpenWrt / LEDE に入らないと将来はあやしい。
**こんなのあるんだ。これを拡張するのかな [https://www.kernel.org/doc/html/latest/driver-api/iio/index.html Industrial I/O (IIO)]
*公式版 LininoOS (LininoIO 版) は Barrier Breaker(14.07) ベース。 (/etc/linino_version には attitude_adjustment とあるが)(あかん..)
*Chaos Calmer(15.05) ベースの LininoOS もあることはある。


= link =
= link =
Documenting the Yún:
[http://codesnippets.altervista.org/documentation/yun/index.html http://codesnippets.altervista.org/documentation/yun/index.html]
ibuyopenwrt:
[http://www.ibuyopenwrt.com/index.php http://www.ibuyopenwrt.com/index.php]
Filebeat を動かすための mips Golang 情報:
Filebeat を動かすための mips Golang 情報:
  [http://akagi201.org/blog/golang-on-openwrt/ Golang on OpenWrt · Akagi201]
  [http://akagi201.org/blog/golang-on-openwrt/ Golang on OpenWrt · Akagi201]