EZ-BLEでI2C to BLEを試す

今回はCypressのEZ-BLEモジュールでI2C→BLE変換を試してみたいと思います。

EZ-BLEモジュール用プロジェクトの作成

I2C→BLE変換プロジェクトはCypress公式のPSoC-4-BLEのサンプルプロジェクトとして公開されています。
PSoC-4-BLE/100_Projects_in_100_Days/Day035_I2C_BLE_Bridge at master · cypresssemiconductorco/PSoC-4-BLE · GitHub
今回はこれをCYBLE-022001-00用にビルドして用いました。

I2C_BLE_Bridgeサンプルロジェクトを開き、プロジェクトのデバイスを変更します。
プロジェクトを右クリック→Device Selector
からCYBLE-022001-00を選択しました。

次にこちらを参考に、コンポーネントをアップデートしたり、Bootloadableを追加したりします。
必要に応じてピン配置を変える必要もあります。
EZ-BLE PRoC を使ってみる - たるたるソース

ビルドがうまく行ったら書き込みEZ-BLEモジュールの準備は完了です。

PCとの接続

PCとの接続方法はI2C_BLE_BridgeプロジェクトのドキュメントP5~7に書いてあるため省略します。
PSoC-4-BLE/I2C-BLE Peripheral.pdf at master · cypresssemiconductorco/PSoC-4-BLE · GitHub

ドキュメントのFigure 8 Enabling notificationsの画面が表示されればそれ以降はやらなくてOKです。
この画面に受信したデータが表示されます。

EZ-BLEにI2C信号を入力する

今回はI2Cのテスト信号としてESP32を用いました。
I2Cの信号が出ればなんでもOKです。

I2C_BLE_BridgeプロジェクトのI2Cモジュールのプロパティを見ると、slave addressは0x08になっています。
なので、0x08を送ってから送りたいデータを送ればOKです。

ESP32で使用したソースコードはこちらです。

#include <Wire.h>

void setup() {
  int SDA = 25;
  int SCL = 26;

  Wire.begin(SDA, SCL);
}

byte val = 0;

void loop() {
  Wire.beginTransmission(0x08);
  Wire.write(val);
  Wire.endTransmission(true);

  val++;
  delay(20);
}

実際に通信してみる

受信したデータはCySmartの画面から見れます。青いところが受信したデータです。
f:id:taltalp:20170926232257p:plain
通信中のI2C信号も見てみました。 ちゃんとACKが返ってきています。
f:id:taltalp:20170926232335p:plain

EZ-BLE PRoC を使ってみる

Cypress EZ-BLE PRoC というとても小さなモジュールを手に入れたので、
早速これでLチカしてみたいと思います。

用意したもの

チップ単体は1cm×1cmと非常に小さく、これだけでは扱いにくいので、
評価ボードを使って見ようと思います。

今回用意したのはこれだけです。
S6SAE101A00SA1002 Solar-Powered IoT Device Kit
※このキットの場合、技適の通ったBLEモジュールを載せ替える必要があります。

ちなみに、このモジュールを用いたものとして他に、
コイン型センサーモジュールなんかもあります。
CYALKIT-E03 Solar-Powered BLE Sensor 5 Pack

小さな太陽電池でも動く小型で省電力なモジュールなようで、いろんな用途に使えそうです。

PSoC Creator のインストール

S6SAE101A00SA1002 Solar-Powered IoT Device Kitの下の方の関連ファイルから
S6SAE101A00SA1002 Complete Setup (Kit Design Files, PSoC Creator 3.2 SP1, CySmart, PSoC Programmer, Documentation, Examples)
というファイルをダウンロードしてインストールしました。

これでPSoC開発環境のPSoC CreatorとEX-BLEの書き込みソフトやサンプルプロジェクトなどがインストールされました。

サンプルプロジェクトを開く

先ほどインストールしたディレクトリを見てみると、
C:\Program Files\Cypress\Solar-Powered IoT Device Kit\Firmware\other
にサンプルプロジェクトの
LED_ONOFFSimple_BLEがあります。
LED_ONOFFのディレクトリをマイドキュメントなど適当な場所にコピーして、
LED_ONOFF.cydsn\LED_ONOFF.cyprj
を開きます。

LED_ONOFFプロジェクトのTopDesign.cyschを開くとこんな画面が出てきました。

コンポーネントのバージョンが古いと怒られているので、
Project→Update Components
コンポーネントのバージョンを最新版にしました。
BootloadableとLED_Greenピンがあります。

どうやらブートローダーでプログラムを読み出すみたいです。
(詳しくはhttp://www.cypress.com/file/187321/download:Title=S6SAE101A00SA1002 User Guide.pdfに書いてあります。)

同様に、
UART_BootloaderをSet As Active Projectでアクティブにし、Update Componentsします。

こちらは、BootloaderとUARTコンポーネントが含まれています。
おそらくUART経由でプログラムを読み出すということでしょうか。

プロジェクトのビルド

まずは、UART_Bootloaderのプロジェクトを右クリックして、Buildします。
うまくいくとたくさんのファイルが生成されます。

次は、LED_ONOFFプロジェクトのBootloadableコンポーネントをダブルクリックして設定を見てみます。
DependenciesタブでBootloaderのhexとelfのパスが指定されていますが、微妙にパスが違っていることがあるので、
もともと書いてあったパスを参考にこのhexとelfを探して指定します。

そして、LED_ONOFFプロジェクトをビルドします。
すると、こちらも大量のファイルが生成されます。

ここで、LED_ONOFFのプロジェクトディレクトリで、「.cyacd」ファイルを検索すると、
「LED_ONOFF.cyacd」というファイルが見つかると思います。
これが書き込むファイルです。

書き込み

書き込みについては詳しくはhttp://www.cypress.com/file/187321/download:Title=S6SAE101A00SA1002 User Guide.pdf
に書いてあります。

簡単に説明すると、
C:\Program Files\Cypress\Solar-Powered IoT Device Kit\1.0\PMIC Software\Bootloader_Host_GUI_exe\UARTBootloaderHost.exe
を実行すると、書き込み画面がでます。

評価ボードをUSB接続して、COMポートを指定、
ボーレートを115200に指定
さっきのLED_ONOFF.cyacdを指定
評価ボードのSW2を一回押してからBootloadボタンを押すと書き込みが始まる。

と言った感じです。

動作確認

評価ボードのLEDがチカチカすれば成功です。

仮想I/O (VIO) IPコアを使ったFPGAのデバッグ

今回は、LogiCORE IP Virtual Input/Output (VIO) コアを用いてFPGAの内部信号をPCからコントロールしてみます。

どんなことができるのか

VIOを使うと、Vivadoの画面上でピンや信号線の状態を監視したり、操作したりすることができます。

ILAと同じくデバッグ用のIPコアです。
波形を見たいときはILAを使い、信号線をPCから操作したいときはVIOを使うといった感じでデバッグをしていきます。

下の画像は、LEDが接続されたピンを操作して、ZYBO上のLEDをコントロールしている様子です。

今回はVIOの使い方について書いていこうと思います。

続きを読む

ESP32で複数のシリアルポートを開く

ESP32の中に入っている3つのUARTを使ってみようと思います。

やり方

Arduinoのサンプルに「MultiSerial」と言うものがあります。
これを少し編集してシリアルポート0以外のポートを開くことができました。

// ---------- ここを追加
HardwareSerial Serial1(2); // UART2を使う
// ----------

void setup() {
  // initialize both serial ports:
  Serial.begin(115200);
  Serial1.begin(115200);
}

void loop() {
  // read from port 1, send to port 0:
  if (Serial1.available()) {
    int inByte = Serial1.read();
    Serial.write(inByte);
  }

  // read from port 0, send to port 1:
  if (Serial.available()) {
    int inByte = Serial.read();
    Serial1.write(inByte);
  }
}

ESP32のIO16とIO17(UART2のTX,RX)を直接接続することでループバックテストをすることができました。

問題点

今回はUART0と2を使用しました。
UART1は下記のサイトに書いてあるように、デフォルトでSPI Flashに設定されているようです。
ESP32 devkit esp-idf UART1 examle not working - ESP32 Forum

UART1の使い方については分かり次第ブログに書こうと思います。

追記

Qiitaのこちらの記事で、UART1を使用する方法が書かれた記事についての紹介がありました。
Arduino-ESP32 Serial通信 - Qiita
Secret Serial Port for Arduino/ESP32 | Hackaday
どうやら、ライブラリを直接いじる必要があるみたいです。

Arduino TIANの概要

Arduino TIANというボードを使う機会があったので、このボードについていろいろと紹介して行こうと思います。

Arduino TIANとは

Linuxが動いて、Wi-FiBluetoothEthernetがついてるボード…らしです。
ボード価格は1個1万円程度とArduinoとしてはかなり高価なボードです。

下記ページにて詳しい説明があります。
www.arduino.org

このArduinoボードは普通のArduinoボードとは少し違っていて、Linuxが動くマイクロプロセッサと、ArduinoIDEで開発できるマイクロコントローラが載っていて、それらのチップはシリアルで通信をしているようです。
この仕様についてブロック図で見ていきましょう。

Arduino TIANの回路図(ブロック図)

Arduino TIANのホームページにあるarduino-tian-schematic.pdfを見てみると、1ページ目にこのボードのブロック図が示されています。
f:id:taltalp:20170502164755p:plain
この図を見ると2つのCPUがあるのがわかります。

MIPS 74K CPU
Linuxが動くCPUでAtheros AR9342というMIPSプロセッサです。

・SAMD21G18
ArduinoIDEで開発できるCPUで、アーキテクチャはARM Cortex-M0+です。

この2つのCPUはシリアル通信で相互に通信ができるようです。

続いて各モジュールについて詳しく見ていきましょう。

Wi-Fiモジュール
MIPS 74K CPUに接続されています。
Linux側から使うようです。
ArduinoIDEに入っているWi-Fiサンプルプロジェクトは使うことができなさそうです。

・CP2105(USB-UART)
USB-UART変換チップです。
こちらはMIPS 74K CPUとSAMD21G18Aのどちらにも繋がっています。
実際にPCにUSB接続するとCOMポートが2つ認識されます。
SAMD21G18Aとの接続ではArduino UNOのように、プログラムの書き込み、シリアル通信のコンソールとして動作します。
MIPS 74K CPUとの接続ではLinuxのコンソール画面が出てきました。こちらからOSを操作することができそうです。

・AU6350(USB2.0 HUB)
USBハブチップです。ホストはMIPS 74K CPUとなっています。
USBデバイスとして
・SAMD21G18A
Bluetoothドングル
・基板上のUSBコネクタ
・ピンヘッダのD+、D-ピン
が接続されています。
USB関連(Bluetoothも含め)はLinux側から制御するようです。
ArduinoIDE側ではUSBデバイスの開発が可能なようです。

・ピンヘッダ
Arduino互換のデザインとなっているピンヘッダはSAMD21G18Aに接続されています。
ArduinoIDEから通常の開発と同様に操作することができます。

pythonで印刷するメモ(mac・linux編)

今回はpythonから何かをプリンターで印刷したい時にどうすればいいかについてです。
自分用のメモ書きなので適当な説明です。

テキストを印刷してみる

import subprocess

# ただのテキスト
text = 'print out message'
# ファイルから印刷する場合
text = open('text.txt', 'r').read()

p = subprocess.Popen('lpr', stdin=subprocess.PIPE)
p.communicate(text)
p.stdin.close()

lprコマンドにパイプしてデータを渡すだけで印刷ができました。とても簡単です。

画像を印刷してみる

今回やりたかったのは、画像を生成してそれをファイルとして書き出さずにそのまま印刷する方法です。PILで適当な画像を生成して印刷してみます。

import subprocess
from PIL import Image
from StringIO import StringIO

buf = StringIO()

# create an image
screen = (500, 500)
bgcolor = (0x00, 0x00, 0x00)
img = Image.new('RGB', screen, bgcolor) 

# save this image to memory as a png image
img.save(buf, 'PNG')

# print out
p = subprocess.Popen('lpr', stdin=subprocess.PIPE)
p.communicate(buf.getvalue())

p.stdin.close()
buf.close()

StringIOを使ってメモリ上に画像ファイルを作って、それをlprコマンドに渡してあげることで印刷することができました。

Linuxデバイスドライバを書いてみる(2)

前回は最小構成のカーネルモジュールを作ってみました。
taltalp.hatenablog.jp

今回はデバイスを/devに登録して,ユーザー空間からデバイスドライバに触れてみたいと思います。

続きを読む