2018年6月28日木曜日

Ubuntu 18.04 Line入力をスピーカーへ

Windows 時代はごく普通にスマホなどを Line 入力につなぎ Bluetooth ヘッドホンで聞いていたのですが、Ubuntu に変えてからこれができなくて悩んでいました。

PulseAudio 音量調整をいじってみると Line 入力にはちゃんと音が来ているようなのになぜかスピーカーやヘッドホンなどからは音が出ない…

1. arecord でループバック


$ arecord -r 44100 -c 2 -f S16_LE | aplay

2. PulseAudio ループバックモジュール読み込み


一時設定

$ pactl load-module module-loopback

恒久設定

$ sudo vi /etc/pulse/default.pa

末尾に追加
load-module module-loopback

2018年6月27日水曜日

M5Stack m5cloud を試してみた。その3

ちょっとしたテストも兼ねて HTTP にて Google のホームページの読み込みを行ったあと、何かボタンを押すまで待ち、5秒毎に内蔵の磁気センサーを読んで10回分をまとめて Ambient に送信するコードを書きました。

センサーを読んでクラウドに送ると言った基本的な部分は抑えられたかと思います。

from machine import I2C, Pin
import machine, utime, time
from m5stack import lcd
import urequests
from mpu9250 import MPU9250
import ambient

def format(n, length):
    n = int(n)
    n = str(n)
    l = len(n)
    if l < length:
        n = " " * (length - l) + n
    return n    

def isPushAnyKey():
    if buttonA.isPressed():
        return True
    if buttonB.isPressed():
        return True
    if buttonC.isPressed():
        return True
    return False

def push_any_key():
    lcd.print("Push Any Key.¥n")
    while not isPushAnyKey():
        utime.sleep(0.01)

def lcdPrintln(str):
    print(str)
    lcd.print(str + "\n")

# Fit watch
rtc = machine.RTC()
lcdPrintln("Synchronize time from NTP server ...")
rtc.ntp_sync(server="ntp.nict.jp", tz='JST-9')


# init LCD
lcd.clear()
lcd.setBrightness(200)
lcd.font(lcd.FONT_Default)
lcd.setCursor(0, 0)
lcd.setColor(lcd.WHITE)

# get google 
lcdPrintln("get http://www.google.com")
response = urequests.get("http://www.google.com")
lcdPrintln("status: " + str(response.status_code))
#print(response.text)
push_any_key()

# read gyro
lcd.clear()
lcd.setCursor(0, 0)

am = ambient.Ambient(チャンネルID, "ライトコード")

i2c = I2C(scl=Pin(22), sda=Pin(21))
imu = MPU9250(i2c)
while True:
    data = []
    lcd.clear()
    while len(data) < 10:
        g = imu.magnetic
        x = format(g[0], 6)
        y = format(g[1], 6)
        z = format(g[2], 6)
        lcdPrintln(x + " " + y + " " + z)
    
        dt = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        data.append({"created": dt, "d1": g[0], "d2": g[1], "d3": g[2]})

        utime.sleep(5)
    
    r = am.send(data)
    lcdPrintln("http-status: " + str(r.status_code))


このコード特に問題ないように見えますが、延々と走らせておくと Ambient オブジェクト内でエラーを起こしてプログラムが停止してしまいます。このままでは実用にならないので、自前サーバーを立てることにします。

ちょっと話がそれますが、m5cloud を使わずにオフラインでの開発方法について備忘録。

1. アップロードツールのインストール

$ sudo pip install adafruit-ampy

2. ソースコードのアップロード方法

$ ampy -p /dev/ttyUSB0 put ./flash/main.py /flash/main.py

この方法だと、デバッグ情報などを見るシリアル通信と交互に行う、言い換えるとファイルをアップロードするたびにシリアル接続を切断して、アップロード後につなぎ直すというとてもめんどくさいことになります。

しかし、m5cloudのソースエディタは最少機能なので Visual Studio Code などの使いやすいエディタが使いたいです。なので、ソースの編集は Visual Studio Code で行い、ソースをまるごと m5cloud の IDE にコピペして m5cloud から実機にアップロードというやり方が良い気がします。

ANYCUBIC i3 Mega 3D 付属の Cura を Ubuntu にインストール

3D プリンター「ANYCUBIC i3 Mega 3D」というものを購入しまして、早速組み立てテスト印刷まで行いました。


で、早速 WeMos D1 Mini を収めるケースを作ろうと、「Thingiverse」にいってモデルを物色「WeMos D1 Mini + PIR case」というのを発見。


早速これを印刷してみようと、.stlファイルを SDカードに入れたのですが印刷メニューに出てこない…

よく調べてみると、.stl から .gcode というファイルを作らなければいけない。.gcode というファイルを作るには付属の SDカード内に格納されている Cura というソフトを使う。

なら、インストールしようと SDカード内を見ると… MAC 用しか入っていない><;せめて Windows 用があれば仮想マシン上で走らせることもできるのに…
# 2018年1月のMacの世界シェアはわずか10%

もしかしてと思いメーカーのサポートページを開くと、Cura_15.04.6_Win というのがありました。 う〜ん、Linux 版を期待したのに…

で、「Cura Ubuntu」で検索してみたところ「Ultimaker Cura 3.4」というものを見つけました。バージョンが全然違うので一抹の不安を覚えますが、とりあえずやってみようとダウンロードしファイルをダブルクリックするとパスワードを求められたのでインストールが始まるかと思いきや何もおきず???

なんだと思ってあちこち開いてみると AppImage というものがマウントされている…その中に AppRun というファイルがあるのでこれをダブルクリックすると起動した\(^_^)/

ん?!でもこれじゃぁこのアプリを使うたびにマウントしてから起動するの? で、再び検索、とりあえず 「cura appimage ubuntu」 を調べると「AppImage形式のインストール方法は?」というページが出てきました。

なるほど、実行権を付けてからダブルクリックすればいいのね。

ということで無事インストール完了し自動的にアプリが起動しました。とりあえず終了して、再度起動しようとしたけどアプリケーションメニューのどこにもそれらしきアプリがない><;

cura* で find してみたけど何も出てこないし…

そこで何気に Cura-3.4.0.AppImage をダブルクリックすると Cura が起動…あ!これってインストーラーじゃなくてアプリそのものなんだ!

念の為、Windows に Cura_15.04.6_Win をインストールして起動すると「New version available」 インストールをクリックすると、「Ultimaker Cura 3.2」をダウンロードw

ということは、Ubuntu用で問題ないのね\(^_^)/

2018年6月25日月曜日

M5Stack m5cloud を試してみた。その2

前回の記事では、ハードウェア(ファームウェア)のセットアップをしました。今回はソフトウェア(ウェッブアプリケーション)の設定を行います。

1. m5cloud に登録


http://cloud.m5stack.com/ にアクセスします。

[Register] ボタンを押します。

メアドとパスワードを入力して[Register]ボタンを押します。

Chrome だとレイアウトか崩れてパスワード入力欄の上に[Login]ボタンがかぶってしまっています。私の場合は Chrome に ID とパスワードを記憶させたのでこのまま[Login]ボタンを押しました。

2. デバイスの登録


デバイス・マネージメントが表示されたら [Add] ボタンを押します。

M5Stack の電源を入れ、チェックコードを表示させます。(チェックコードは一定時間ごとに変わります)

チェックコードを入力します。

IDEを開きます。

デバイス選択画面です。まだ1つしか登録されていないのでそのまま [OK] ボタンを押しました。

[File Syncing] と表示されて、サンプルアプリがデバイスにアップロードされます。

サンプルアプリは中身がすべてコメントアウトされているため、デバイスで実行されているにもかかわらず「Run:"main.py"」と表示されるのみです。とりあえずコメントを外して、画面右下の「Upload  & Run」ボタンを押します。

画面に 「Hello World!」と表示されました。

さ〜てと、Python か〜。インデントが段落を表すとかあんまり好きになれそうもないけど頑張ってみるかな…

ということで今回はここまでです。

次回は、加速度センサーの値を読み込んでサーバーに送信させようと思っています。ただ、RFタグを読ませてほしいなんて話が出ているのでもしかするとそちらが先になってしまうかもしれません。(予定は未定w)

2018年6月19日火曜日

M5Stack m5cloud を試してみた。その1

M5Stack という5センチ角ほどのマイコンを試してみました。今回は M5Stack GRAY という加速度、ジャイロ、磁気を計測可能な9軸センサ、MPU9250を搭載したモデルを使用しました。


ILS - M5Stack ESP32 MPU9250 9Axies Motion Sensor Core Development Kit Extensible IoT Development Board

※ Ubuntu 18.04 での記録です。

MCU には技適取得済みの ESP-WROOM-32 が搭載されているので日本でも合法的に使えます。また、フルカラー液晶、3ボタン、microSDカードスロット、スピーカー、バッテリーまで搭載されています。

ESP-WROOM-32 という MCU は 32Bit デュアルコアCPU、 SRAM 520KB、 FLASH 4MB、 Wi-Fi、Bluetooth、タッチセンサー、ホールセンサー、温度センサーを内蔵しています。

普通に Arduino として使えるのですが、今回は microPython が使えるクラウドベース開発環境の m5cloud を試してみました。

1. esptool.py のインストール


ESP32 を Arduino で使っとことがあれば Arduino/IDE/hardware/espressif/esp32/tools/esptool.py などにすでに入っているかもしれません。
また、ESP Easy などを使うためにすでにダウンロードしてあればそれを使ってください。
初めて使うなら下記のコマンドでインストールできると思います。

$ pip install esptool

上記で ~/.local/bin にインストールされると思います。

2. ファームウェアのダウンロード


github に置かれていますのでダウロードしてください。

https://github.com/m5stack/M5Cloud/raw/master/firmwares

私は v0.4.0 というものを入れてみました。

$ wget https://github.com/m5stack/M5Cloud/raw/master/firmwares/m5cloud-20180516-v0.4.0.bin

3. ファームウェアのインストール


$ esptool.py --chip esp32 --port /dev/ttyUSB0 erase_flash
$ esptool.py --chip esp32 --port /dev/ttyUSB0 write_flash --flash_mode dio -z 0x1000 m5cloud-20180516-v0.4.0.bin

4. 起動


起動すると下記のような画面になりました。



Cボタンを押しながら起動すると WiFi 設定モードになると書かれているようです。

5. スマホにて Wi-Fi 接続


スマホの Wi-Fi 一覧を開くと「M5Stack-xxxx」といった SSID があると思いますのでそれに接続します。

6. 設定画面

ブラウザにて 192.168.4.1 を開くと M5Stack が接続する…はずなのですがしばらく待たされたあと「[504] Gateway Timeout」と表示されてつながりません><;

う〜ん、なんだろうとあれこれいじりまわしてみるた結果、モバイルデータ通信をオフにしてやると設定画面が表示されることがわかりました\(^_^)/

Wi-Fi アクセスポイントの設定画面が表示されますので、M5Stack がインターネットアクセスに利用する SSID とパスワードを入力します。


[Configure] ボタンを押すと設定が保存され M5Stack はその Wi-Fi アクセスポイントに接続するのでスマホが接続されていた [M5Stack-xxxx] というアクセスポイントはなくなっていますので、スマホのブラウザにはエラーが表示されますが M5Stack の画面の「Check Code: xxxxxx」と表示されていれば完了しています。

SSID やパスワードを間違えたときは、M5Stack の C ボタン(右端のボタン)を押しながら起動すれば [M5Stack-xxxx] のアクセスポイントが現れて再度設定できます。

今日はここまで。





2018年6月14日木曜日

新デザインのGmailでビューを選択し直す

ちょっとわかりにくかったのでメモ

1. 画面左上のが歯車ボタンを押す


2. メニューから「表示間隔」を選択


3. ビューの選択が表示される




2018年6月11日月曜日

ionic3 で HTTP 通信

基本的なことは下記のページに書かれています。


$ ionic cordova plugin add cordova-plugin-advanced-http
$ npm install --save @ionic-native/http

これで準備は完了。

let url = 'http://hoge.hoge.com/test.php';

let body = {
  'sid': this.data.server.siteID,
  'tac': this.data.terminal.account,
  'tpw': this.data.terminal.password,
};

let headers = {};

this.http.post(url, body, headers).then((res: HTTPResponse) => {
  // 成功
  console.log(res);
  resolve(res);
}).catch((res: any) => {
  // エラーが発生した
  console.log(res);
  resolve(res);
});

利用も簡単!

なんて楽ちんなんだろうと思ったら大間違いでした…

Android ではなんの問題もなく通信できたのですが、iOS では then() にも catch() にも来ません???

XCode のコンソール出力を見ると、cordovaHTTP is not defined と出力されています???
なんでだろうと散々調べたのですがさっぱりわからず。念の為 cordova-plugin-advanced-http をremove 後に、再度 add。
cordovaHTTP is not defined は出なくなり、http.post() 呼び出し後リクエストの送信は行われるのですが、相変わらず then() にも catch() にも来ません><;

先に種明かしすると、この原因は content-type でした。

クライアントからのリクエストもサーバーからのレザルトも単なるテキストなので、plain/text を返していたのですが、application/json を返さないとサーバーからのレザルトを受け取らないようです。

いやはやマイナーOSは情報少ない上に癖が強くてホント苦労させられる><;

シャープ SH-M05 レビュー 使用開始22日目

だいたいわかってきました。

悪口ばかりかいているのでまず良い点を^^;

「エモパー」なかなかいい感じです。
夜間は枕元に置いて充電しているわけですが、朝起きて充電ケーブルを外すと「おはようございます」に続けて今日の天気とかちょっとした情報を話してくれます。これはなかなか便利です。

時間や位置情報、日々の行動などを学習しているようで「そろそろ出かける時間ですね」とか言ってきます。

ダメなのは、指紋認証とカメラです。

指紋認証は指が乾いているときは7割程度の確率で認識しますが、濡れていると完全にアウト!ちょっと汗ばんでいる程度でも認識率は3割以下に落ちてしまいます。Huawei P10 Lite ではほとんど認識ミスすることはなかったので、まるっきりダメダメです。2013年に発売されたソフトバンクの F301 は当時としては最先端の指紋認証を搭載していましたが、それよりはちょっとマシかなという感じです。

カメラはとにかくメシマズ、食べ物の写真が汚らしいです。また、画面を横にして撮影しようとすると「本体上端の近接センサーが…」となっがたらしい文章が出てきたあとブラックアウト、指紋センサー認識率悪くてロック解除にアタアフタ…シャッターチャンスを逃すのなんの><;

スイカはモバイルだと自動チャージできて便利だけどカードでもそれほど困らないから、防水なしの恐怖に耐えられれば、P10 Lite から SH-M05 に機種変してもメリット全然ないです…

これはダメではないのですが不便な点。

P10 Lite や nova2 lite だと、スタンバイになった際に終了させるアプリを選べる、逆の言い方をすると強制終了させないアプリを選べるのですが、SH-M05 ではその設定がどこにあるのかわかりません。おかげで Kindle を起動するたびに本選ぶところから始めなくてはならず不便です…

ionic3 で iOS 版のアプリタイトルを日本語にする方法

config.xml にて設定してやると *-Info.plist を書き換えられると書かれているページが複数あり、よく見かけるタイプは config-file というタグでした。それを加工して下記みたいにしてみたわけですが、全く効果なし…

<config-file parent="CFBundleDisplayName" platform="ios" target="*-Info.plist">
    <string>アプリ名</string>
</config-file>

何だろうなぁと思っていましたが、動かないものは仕方ないので、トランスパイル後 XCode でコンパイルする前に *-Info.plist を手動で書き換えていました。(操作性最悪の iMac でこれやるのってほんとめんどくさい)

例によって Android では問題なく動くものが iOS で動かない現象に遭遇しまして、あれこれ調べていると下記の edit-config というタグの説明を発見!

お!っと思い下記を試すと大成功でした\(^_^)/

<edit-config file="*-Info.plist" mode="merge" target="CFBundleDisplayName">
    <string>アプリ名</string>
</edit-config>

ちなみに Android では、 ./platforms/android/app/src/main/res/ に values-ja というフォルダーを作り、 ./platforms/android/app/src/main/res/values/string.xml をコピって、書き換えてやれば多言語対応できます。


2018年6月4日月曜日

Arduino Uno の電源

Arduino Uno を使った場合は基本的に実験が主になるので、いままで電源はほとんど USB からの供給でした。なので全然気にしていませんでしたが、先日、プラレールのRC化をした際電池駆動を試してみたところ VIN への 5V 供給ではうまく動かなかったので調べてみた備忘録です。

Arduino への電源供給


1. USB 端子

こいつは何も考える必要はないかな^^;

2. VIN

DCコネクタと同じ回路に繋がっていて、7〜12V の電源を供給する。
ここの電圧が 6.6V 以上だと USB の + と +5V の間にある FET がオフになって USB からの電源供給が止まる。

恥ずかしながら VIN なのでここに 5V 入れてやれば動くと思っていたのですが、うまく行きませんでした^^;

3. +5V

USB端子からの電源または VIN の電圧を降圧して 5V にしたものが繋がっている端子。

実は私はこの端子は出力専用だと思っていたのですが、ここに 5V を接続してやって電源を供給することができます。

公式ではおすすめしないとのことになっているようですが、それはおそらく「電圧が違っていると壊すからやめといたほうがいいよ」ということらしいです。

参考ページ