tinkering好きの素人

ものづくりの記録

NEO-6M GPSモジュール(NEO-6M-0-001)を使って緯度経度・時刻を取得してみた

日の出、日の入りをwebを介さずに判断したくてgpsモジュールを使ってみることにしました!
ajjax.hatenablog.com
を参考にさせていただきました。

ただし、初心者の私はそもそもmacでシリアル通信をどうやったらいいのかもよくわからず…

ということで初心者のmacユーザー向けに解説していきます^^

接続方法

まずこのGPSモジュールを使うにはFTDIケーブルが必要です(Arduinoなどでもできると思いますが、とりあえずシンプルにこちら)

これでGPSモジュールと接続します、
Vcc→Vcc、GND→GND
なのはいいのですが、注意すべきなのは、
Rx→Tx、Tx→Rx
であることです(当然のことのようですが初心者にはわからず…)

接続ができたら準備完了です

ターミナルからのアクセス

次に、mac のターミナルからUSBポートにアクセスしていきます
qiita.com
こちらを参考にscreenします
そうすると、
$GPRMC,084129.00....
みたいな感じのものが帰ってくると思います^^
こちらの意味は
5.出力データ【GM-38:マーキュリー取扱説明書】
でも解読できますし、
NMEA Decoder. Using this free tool you can decode (parse) your NMEA log.
というめちゃくちゃ便利なものも。

ただし、私の場合緯度経度のわかる接続状態になるまで20分ほどかかりました…^^;
安物だから仕方ないかな
(2回めからは30秒程度に!最初はセットアップ的なことがあるんでしょうか…?)

konashi (bluetoothモジュール)をswiftで動かしてみる

bluetoothをかんたんに試せると聞いてkonashiというモジュールに挑戦。

www.switch-science.com

と思ったのですが、公式のドキュメントはobjective-cしかないんですね…

ありがたいことにswiftでやってくださった先人がいらっしゃったので、参考に。

SwiftからKonashi SDKのクラスを使うkazz12211.wordpress.com

大雑把に言うと、

  • 普通にkonashi-ios-sdkを公式からgit clone

github.com

  • 以下と全く同じように5まですすめる。6からちょっとだけ違う。

konashi.ux-xu.com

  • 以下に従って{product-name}(KonashiGettingStartedとかですかね)-Bridging-Header.hを作成。

場所は私の場合プロジェクトファイル直下でした
SwiftからKonashi SDKのクラスを使うkazz12211.wordpress.com

  • 上のHeaderファイルを少し書き換えます

#defineと#endifの間に

#import "Konashi/Konashi.h"

を加えるだけ。(以下を参考にさせていただきました)
qiita.com

  • Story Boardにボタンを作ってViewController.hの@IBActionとコネクト。
  • あとは以下の7以降のSTEPに従うだけ

konashi.ux-xu.com


意外とかんたんにLED光って一安心。

google cloud speech api を使ってスクリプトだけを抽出する

minoritytech.hatenablog.com

こちらで動かしたサンプルコードだと、音声認識した結果のディスクリプション(候補とか候補ごとの可能性とかでてきちゃう)しか出せない。

スクリプト、つまりしゃべった内容の1番もっともらしい文を抽出する方法について意外と日本語の解説がなかったので、書き残しておきます。

サンプルコードの

response.description

のところを

((response.resultsArray[0] as! StreamingRecognitionResult).alternativesArray[0] as AnyObject).transcript

にします。

素直にドキュメントを読んだら割りとすぐにわかりますね^^

Package google.cloud.speech.v1  |  Google Cloud Speech API  |  Google Cloud Platform



#Swift #google cloud speech api #iphone #iOS

google cloud speech api を使ってサンプルを実機iphone 6で動かしてみた

google音声認識APIの精度が大幅にあがったと聞いてiphoneで試してみたくなりました.
swift, objective-Cに関する知識は皆無ですが,公式の解説が親切そうだったのでチャレンジ.

github.com

まずはこちらのサイトにアクセスしてみます.

クイックスタート曰く,

  • Clone this repo and cd into this directory.
  • Run ./INSTALL
  • In Speech/SpeechRecognitionService.swift, replace YOUR_API_KEY with the API key obtained above.
  • Build and run the app.

らしい.

環境は

  • An API key for the Cloud Speech API (See the docs to learn more)
  • An OSX machine or emulator
  • Xcode 8 beta 6 or later
  • Cocoapods version 1.0 or later

があればいいらしい.

Macなので2個目,3個目は特に問題ないです.
手順は以下です.

APIキーの取得

google cloud platformに登録します.登録の詳しい手順は除きます.
さて,登録ができたらAPIキーの取得です
取得の順序はこちらの方の手順の3番の途中までを参考にさせていただきました。

qiita.com

2番までできたら,3番で「サービスアカウントキーの取得」ではなく「APIキー」を選びます.
現れたキーコードをコピーしてください.
これで取得完了です.

cocoapodsのインストール

qiita.com

こちらの方の「cocoapodsの環境構築」までの手順を参考にさせていただきました。
とても簡単でした.

これで準備完了です.

リポジトリをクローン

先程も挙げた

github.com

をクローンするわけですが,gitをインストールしている人はターミナルで

git clone https://github.com/GoogleCloudPlatform/ios-docs-samples.git

でOKと公式に(優しい).
一瞬でした.

run ./install?よくわかんないのでpod install

こちらできませんでしたが,やらなくても動作しました.
代わりに,というわけではないですが,/ios-docs-samples/speech/Swift/Speech-gRPC-Streamingにターミナルでcdして

pod install

をしました(podのファイルをアクティベートしてる感じかな?)


[追記]
もう一回やってみたらpod updateできなかった。
github.com

こちらの2/3のsamskiterさんの書き換えに従ったらできた

xcodeプロジェクトのAPIを書き換える

/ios-docs-samples/speech/Swift/Speech-gRPC-Streaming/Speechにある,SpeechRecognitionService.swiftを書き換えます.
このファイルを開いて,
let API_KEY : String = "YOUR KEY"
のyour key の中に先程取得したAPIキーをコピペしてセーブで完了です.

エラーの出るところを書き換える

エラー出たらswiftのわからない私には結構ピンチですが,出ました.
こちらの方のSTEP2を参考にさせていただき,

qiita.com

google/........./~~~~.h
のようになっているところを
googleapis/~~~~.h
に書き換え.
ビルド→エラーの出たところをこの法則で直す→ビルド→エラーの出たところをこの法則で直す...と繰り返してエラーがでなくなったらシミュレータでローンチできました!

日本語にする

できた!start streamingをクリックして話すと,認識された
…あれ,英語だ,,ということで日本語に直したい.

言語のサポート  |  Google Cloud Speech API  |  Google Cloud Platform

こちらによるとlanguageCodeをja-JPに書き換えればいいらしい!
そこでSpeechRecognitionService.swift内をxcodeのfindでlanguageCodeと検索し,

recognitionConfig.languageCode = "ja-JP"

に書き換え.
もう一度ビルドすると,かなりの精度で認識されました!

実機で動かす

でもなんとなくシミュレータでは味気ない,,,
ということで実機で動かしたくなりました,が,ここかなり手こずりました.
でも無料で実機テストできるのはいいですね,Androidを使う必要なくなりそうです

xcodeに自分のapple IDを登録

[xcode]>[Preferences]>[Accounts]で+マークをクリックして,IDを登録します.

設定をいじる

Xcodeの階層表示でspeechをクリック

f:id:minoritytech:20180204222412p:plain

この画面で

  1. signingのところでteamをNoneではなく自分で先程登録したユーザ名を選びます.
  2. Deployment Infoでtargetに自分のiOSのバージョンを入れる
  3. IdentityのBundle Identifierをjp.~にする(謎)

3は
qiita.com
こちらを参考にさせていただきました。ほんとに謎,,

実機に繋いでローンチ!

usbでiphonemacにつないで
f:id:minoritytech:20180204222412p:plain
こちらの上の▶■の右横をクリックしてデバイスを自分のIphoneに.

エラーが出た場合はiphone側でアクセスを許可

[設定]>[一般]>[プロファイルとデバイス管理]
デベロッパAPPのアカウント名をタップして許可してください.

ローンチ成功です!
これで外部イヤホンマイクでの音声認識も簡単にできました.

消臭センサ&スプレーをハックしてみた①

アロマディフューザー的なもの自作への第一歩.

前回の「解体してみた」でなんとなく仕組みがわかったのでいよいよPCから制御してみることに.
minoritytech.hatenablog.com

今回は簡単にPCのシリアルモニタの入力からArduinoを介してスプレーを「シュッ」とさせることを目標にします.

まず,もう一度前回の「解体してみた」から仕組みを思い出す.
「シュッ」がモーターの回転で起こっていることはわかったので,モーターを制御しようかとまずは電圧を計測することに.
ちなみに基板はこんな感じ.

f:id:minoritytech:20180109134934j:plainf:id:minoritytech:20180109134944j:plain

スイッチが入ったときのモーターの挙動はこんな感じ.

コマでみたところ,600ms程正電圧がかかって正回転したあと,200ms程負電圧がかかって逆回転してます.

…逆回転させるにはモータードライバが必要だ,めんどくさい.

ということで,ボタンスイッチのところをArduinoから制御することにしました.


こんな感じでスイッチ部から導線を出して,

http://www.hakodate-ct.ac.jp/~moriya/class/2Ssensing/text/006_01transistor.pdf

こちらのサイトを参考にして
ベースをarduinoの2番ピンに,エミッタをarduinoのGNDに,
コレクタとエミッタを先ほどスイッチから出した導線に
接続しました.

トランジスタはこちらを使用.

akizukidenshi.com


arduinoのコードはこちら.

int mot = 2;
char ser;
void setup() {
  // put your setup code here, to run once:
  pinMode(mot,OUTPUT);
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  while(Serial.available()>0){
    ser = Serial.read();
    Serial.write(ser);
  }
  if(ser=='1'){
    digitalWrite(mot,HIGH);
    delay(100);
    digitalWrite(mot,LOW);
    ser=0;
  }
}

これでシリアルモニタで1を入力するとそれが仮想スイッチとなって,モーターが駆動します^^

f:id:minoritytech:20180109190922g:plain

PC入力でシュッができました!

次はかっこいいインターフェイスをProcessingとかでつくって無線でとばしたいな

vba で まとめてcsv読み込み

大量のcsvを読み込んでExcel処理したかったので手動は面倒くさくてvbaに初挑戦したメモ。
OpenTextではなぜかセミコロン区切りのものをうまく読み込んでくれず、手動でやってるときはクエリを使っていたことを思い出しQueryTableを使用。

vba入門はこちらを、
color-chips.net

複数ファイルの読み込みはこちらを、
color-chips.net

QueryTableの使い方はこちらを
water2litter.net

参考にさせていただきました。

Sub QueryMultiCSVFiles()
    ' [[ 変数定義 ]]
    Dim varFileName As Variant
    Dim FileName As Variant
    Dim CSVWorkSheet As Worksheet
    Dim NewWorkSheet As Worksheet
    Dim SheetName As String
    Dim qt As QueryTable
    
   
    ' [[ 複数ファイルパス名を取得 ]]
    varFileName = Application.GetOpenFilename(FileFilter:="CSVファイル(*.csv),*.csv", Title:="CSVファイルの選択", MultiSelect:=True)
   
    ' [[ ファイルパス取得できなかったら ]]
    If IsArray(varFileName) = False Then
        Exit Sub
        MsgBox "Isarray Error"
    End If
 
    ' [[ ファイルパス取得できたら ]]
    For Each FileName In varFileName
        ' [[ ファイルパスからファイル名を取得 ]]
        SheetName = Dir(FileName)
        ' [[ ファイル名で新しいシート作成 ]]
        Set NewWorkSheet = CreateWorkSheet(SheetName)
        
        Set CSVWorkSheet = ActiveSheet
        Set qt = CSVWorkSheet.QueryTables.Add(Connection:="TEXT;" & FileName, Destination:=CSVWorkSheet.Range("A1"))
       
        With qt
            .TextFilePlatform = 932          ' 文字コードを指定
            .TextFileParseType = xlDelimited ' 区切り文字の形式
            .TextFileSemicolonDelimiter = True   ' カンマ区切り
            .RefreshStyle = xlOverwriteCells ' セルに上書き
            .Refresh
            .Delete                          ' CSV との接続を解除
        End With
    Next
   
End Sub


' [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
' [[                                                                            ]]
' [[ ワークシート名を指定したワークシートの作成                                 ]]
' [[                                                                            ]]
' [[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
Function CreateWorkSheet(WorkSheetName As String) As Worksheet

    ' 変数定義
    Dim NewWorkSheet As Worksheet
    Dim WS As Worksheet
    
    Dim iCheckSameName As Integer
   
    ' ワークシートの作成
    ' ※一番最後に挿入
    Set NewWorkSheet = Worksheets.Add(After:=Worksheets(Worksheets.Count))
   
    ' 同じ名前ワークシートが無いか確認
    iCheckSameName = 0
    For Each WS In Sheets
        If WS.Name = WorkSheetName Then
            MsgBox "ワークシート名:" + WorkSheetName + " この名前は既に使われています。"
            iCheckSameName = 1
        End If
    Next
   
    '同じ名前のワークシートがなければ
    If iCheckSameName = 0 Then
        NewWorkSheet.Name = WorkSheetName
        Set CreateWorkSheet = NewWorkSheet
    End If
   
End Function

消臭センサ&スプレーを解体してみた

アロマディフューザーを自作できないかなあと思って色々調べていたのですが、

超音波式は意外と構造が複雑そうだし、

アロマやるなら普通にアナログなやつでいいかなという結論になってしまい、

たどり着いたのがこの製品

 

 

構造が気になったので解体してみた。

 

見た目はこんな感じ。

 

 

 

カバーが開くようになってて、開けると

 

f:id:minoritytech:20171110212929p:plain

 

こんな感じで電池にカセットが挟まれてます。下のところがボタン兼センサかな

 

 

これは解体しやすい、早速ねじを外してみました

 

 

意外とアナログでかわいい!

 

まだねじがあるのでとりあえず外してみる。

f:id:minoritytech:20171110214127j:plain f:id:minoritytech:20171110213522p:plain

 

歯車の部分と、回路とモーターの部分に分解できます

 

青丸の所が、スプレーの上の押すところに引っかかって、

そこがモーター駆動で押し下げられるというなんとも原始的なつくり^^

 

 f:id:minoritytech:20171110214355p:plain

 

歯車の部分はこんなかんじ

 

 

次は回路いじってちょっとハックしてみたい。

 

>>ハックしてみたはこちら↓↓

 

minoritytech.hatenablog.com