カテゴリー別アーカイブ: Zephyr

Intel Quark D2000 Zephyr CURRENT SENSOR

EasyDriverへ供給される電流を電流センサで計測しました。

電流センサは、TIのハイサイド、I2C 出力電流/電力モニタINA219を使用しました。
http://www.tij.co.jp/product/jp/INA219
INA219使用 電流センサーモジュール(カレントセンサー)
http://akizukidenshi.com/catalog/g/gM-08221/

シャント電圧降下とバス電源電圧を計測し、電流と電力が取得できます。

100msec毎にデータ取得しました。
高速回転時が80mA程度、停止時が350mA程度です。

サンプルプログラムは以下にあります。
https://github.com/jendo1969/d2000/tree/master/Step_motor2/src
INA219.hファイルに電流センサの制御をまとめてあります。
https://github.com/adafruit/Adafruit_INA219
ここを参考に作成しました。

Intel Quark D2000 Zephyr STEPPING MOTOR


D2000でステッピングモータを回しました。
バイポーラ ステッピングモーター4SM-42BYG011
http://akizukidenshi.com/catalog/g/gP-05372/
SparkFun ROB-12779 EasyDriver ステッピングモータドライバ
https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-4YRY
EasyDriver – Stepper Motor Driver
https://www.sparkfun.com/products/12779
ドライバIC A3967を使用しているのでパルス出力と方向出力のみでステッピングモータを回すことができます。
ZephyrのPWMのサンプルは、”PWM_0″を対象にしています。
PWM_0は、JTAGピンと競合しているため使用できません。PWM_1を使用するようにしました。

ピンの機能割付けを行いました。
struct device *pinmux = device_get_binding(PINMUX_NAME);
PWM1_PIN(24ピン)を機能C(PWM)に設定します。
if (pinmux_pin_set(pinmux, PWM1_PIN, PINMUX_FUNC_C)) {
これでPWM_1側が使えるようになります。

電源は、DC12Vを使用しています。
65W級スイッチングACアダプター12V5A GF65I-US1250
http://akizukidenshi.com/catalog/g/gM-00510/
D200ボードには12Vから三端子レギュレータで作成したDC5Vを入力しています。
エンコーダカウントが1秒間6400カウントに調整しました。一周1600カウントなので1秒4周です。240rpmで回したことになります。

サンプルプログラムは以下にあります。
https://github.com/jendo1969/d2000/blob/master/Step_motor/src/main.c

Intel Quark D2000 Zephyr Rotary Encoder


D2000にロータリーエンコーダを接続してみました。ロータリーエンコーダは、なるべく安いものを探して以下の物をアマゾンで購入しました。

エンコーダー 元 AB 相 5-24v 400 パルス 増分の光学式ロータリーエンコーダー 本体サイズ 39 * 35.5 mm NPN 出力
https://www.amazon.co.jp/gp/product/B076Q5W251/ref=oh_aui_detailpage_o00_s00?ie=UTF8&psc=1
分解能が違いますが以下の取説を見つけました。
https://uamper.com/products/datasheet/LPD3806-360BM.pdf
エンコーダの出力は、NPNのオープンコレクタ出力です。D2000には、AB出力を4.7kΩの抵抗で3.3Vにプルアップして接続しています。
入力ピンの割り込みを利用して位相計数を行いました。アップエッジ、ダウンエッジの両方で割り込みをかけて4倍の分解能としました。400pprなので一周1600カウントとなります。正転でカウンタ増加、逆転でカウンタ減少が確認できました。

サンプルプログラムは以下にあります。
https://github.com/jendo1969/d2000/tree/master/RotEncoder

Intel Quark D2000 Zephyr XBEE

XBeeで無線接続しました。
Arduino用プロトタイピングボード (Prototyping Shield For Arduino)上にXBeeを接続しました。http://akizukidenshi.com/catalog/g/gM-07033/
XBeeのピッチ変換基板は、
XBee用2.54mmピッチ変換基板を使用しました。
http://akizukidenshi.com/catalog/g/gP-05060/
XBeeは、
XBeeWi-Fi(S6B)モジュール(PCBアンテナタイプ)を使用しました。
http://akizukidenshi.com/catalog/g/gM-06676/

XBeeの場合、通信の大部分をモジュール側で行うので通信の可否はモジュール設定で決まります。

USBからの給電では、ZigbeeのXBeeしか動かせません。
AC-DCコンバータ経由での給電では、WiFiのXBeeも動作しました。

通信確認は、以下のサンプルプログラムを使用しました。
https://github.com/jendo1969/d2000/tree/master/Bmc150_MAG

Intel Quark D2000 Zephyr Grove LCD

D2000のZephyrのサンプルにGrove LCDのプログラムが含まれています。

今回はこのLCDを使用してみました。
Grove RGBバックライト液晶モジュール
http://akizukidenshi.com/catalog/g/gP-09283/
LCDとBase Shield V2は、セットに含まれているものを使用しました。
Grove-Arduinoスターターキット
http://akizukidenshi.com/catalog/g/gK-09167/
http://wiki.seeed.cc/Base_Shield_V2/
LCDの電源は、5VなのでシールドのVCC設定を5Vに設定します。
LCDはI2Cコネクタに接続します。
起動すると簡単に表示が確認できます。

このLCDは、バックライトがカラーLEDになっており、設定により色が変化します。サンプルプログラムは、色の設定を100msec毎に変化させ、設定値をLCDに表示します。
Groveのサンプルは、LCDしかありませんがライブラリ側に対応センサがいくつかあるようです。

Intel Quark D2000 Zephyr BMC150 ACCELOMETOR

BOSCH社製6軸センサ(3軸加速度、3軸磁気)BMC150を搭載しています。
https://www.bosch-sensortec.com/bst/products/all_products/bmc150

今回は加速度計にアクセスします。

#define BMC150_I2C_ADDR 0x10
温度センサとI2Cのアドレスは同じです。
加速度の取得の前にレンジとフィルターの設定を行っています。フィルターは更新時間64ms、レンジは、±2gに設定しました。

加速度データは、0x02レジスタから2バイトづつXYZ軸の順に入っています。6バイトを一度に読み込んでいます。

温度と加速度を500ms毎に取得し、シリアル経由でパソコンに表示しました。

以下にサンプルプログラムがあります。
https://github.com/jendo1969/d2000/tree/master/Bmc150_ACC

Intel Quark D2000 Zephyr BMC150 TEMPERATURE

BOSCH社製6軸センサ(3軸加速度、3軸磁気)BMC150には、加速度センサ側に温度測定を搭載しています。
https://www.bosch-sensortec.com/bst/products/all_products/bmc150

#define BMC150_I2C_ADDR 0x10
#define ACCD_TEMP_REG 0x08
I2Cアドレスが0x10 、温度値のレジスタが0x08です。

温度は、取得した数値が0の時、23℃です。数値1が0.5℃に対応しています。下が変換式はです。
temp_val = ((float)data) / 2 + 23;

1秒ごとに温度を取得し、シリアル通信USART_Aでパソコンに送りました。

数℃実際の室温より高いので校正が必要です。
BMC150 ICを触ると温度が上がるので計測はできているようです。

以下にサンプルプログラムがあります。
https://github.com/jendo1969/d2000/tree/master/Bmc150_Temp

Intel Quark D2000 Zephyr BMC150

Intel Quark Microcontroller Dev Kit D2000には、ボード上にBOSCH社製6軸センサ(3軸加速度、3軸磁気)BMC150を搭載しています。
https://www.bosch-sensortec.com/bst/products/all_products/bmc150
BMC150は、I2CとSPIで接続できますが、D2000とは、I2Cで接続されています。SPピンのレベルでインターフェースの毛帝をします。Kitは、SPピンがプルアップされているのでI2Cとなります。
今回は、ZephyrのI2C APIを使って接続します。
I2Cのアドレスもピン設定で2種類選択できます。SDOピンをGNDレベルにすると加速度センサのアドレスが0x10、磁気センサのアドレスが0x12となります。SDOピンをVDDレベルにすると加速度センサのアドレスが0x11、磁気センサのアドレスが0x13となります。この設定は、J1ジャンパーで切り替えられます。J1をオープンにするとSDOがGNDにプルダウンされ、加速度センサのアドレスが0x10、磁気センサのアドレスが0x12となります。J1をクローズするとSDOがVDDにつながり、加速度センサのアドレスが0x11、磁気センサのアドレスが0x13となります。
今回は、J1はオープンのまま使用します。
I2Cの使用方法は、Zephyrのサンプルにあるi2c_lsm9ds0を利用しました。APIのリファレンスは以下にあります。
http://docs.zephyrproject.org/api/io_interfaces.html#i2c-interface
Zhephyrのサンプルの中にBMC150はありませんが、QMSI側にBMC150のサンプルAccelerometerがあります。これも参考にしました。
I2Cの初期化はそのまま使用できます。
cfg.raw = 0;
cfg.bits.use_10_bit_addr = 0;
cfg.bits.speed = I2C_SPEED_STANDARD;
cfg.bits.is_master_device = 1;

dev = device_get_binding(“I2C_0”);
if (!dev) {
printk(“I2C0: Device not found.\n”);
return;
}

if (i2c_configure(dev, cfg.raw) != 0) {
printk(“Error on i2c_configure()\n”);
return;
}

I2Cの読み書きは、以下の関数で行えます。
i2c_write(dev, &data, sizeof(data), ADDR) ;
i2c_read(dev, &data, sizeof(data), ADDR) ;
次にBMC150から温度の取得を行ってみたいと思います。

Intel Quark D2000 Zephyr UART BY INTERRUPT

UART_Aが使用できるようになりましたが、割り込みを使用した方が、効率が良いので割り込みを使ってみます。

プロジェクトのprj.confファイルで周辺機器の設定を行います。

CONFIG_SERIAL=y
CONFIG_UART_INTERRUPT_DRIVEN=y
CONFIG_UART_QMSI_0=y
CONFIG_UART_QMSI_0_HW_FC=n
CONFIG_UART_QMSI_0_BAUDRATE=57600

割り込みの設定CONFIG_UART_INTERRUPT_DRIVENをyにします。その他は、前と一緒です。

uart0_init(void)初期化関数で
uart_irq_callback_set(uart0_dev, uart0_isr);
割り込み関数uart0_isrを登録します。
uart_irq_rx_enable(uart0_dev);
次に受信割り込みを有効にします。

受信が入るとこの関数が呼ばれます。
static void uart0_isr(struct device *x);

int len = uart_fifo_read(uart0_dev, rx_buf, BUF_MAXSIZE);
受信データをバッファに読み出します。最後に受信文字を送信します。ループバックのサンプルになっています。

以下にサンプルがあります。
https://github.com/jendo1969/d2000/tree/master/UARTint

Intel Quark D2000 Zephyr UART

UART_Aを使用しようと思いましたが、
Zephyrには、サンプルがありません。
探したところ、以下のURLを参考にしました。
https://lists.linuxfoundation.org/pipermail/zephyr-users/2017-January/000537.html

プロジェクトのprj.confファイルで使用する周辺機器の有効無効が設定できます。

CONFIG_SERIAL=y
CONFIG_UART_INTERRUPT_DRIVEN=n
CONFIG_UART_QMSI_0=y
CONFIG_UART_QMSI_0_HW_FC=n
CONFIG_UART_QMSI_0_BAUDRATE=57600

ここでは、シリアルを使用し、割り込みは使用しない設定です。
UART_Aを使用する。
ハードウェアのハンドシェイクは行わない。
通信速度は、57600bpsとするとなっています。

通信確認にはFTDIのUSB・シリアル変換ケーブル(3.3V)を使用しました。
http://akizukidenshi.com/catalog/g/gM-05840/
これでArduinoのシールドでUARTが使用できるようになりました。サンプルは、ただ、aを送るだけのコードです。

サンプルは以下にあります。
https://github.com/jendo1969/d2000/tree/master/UART

© 2014 Spineedge Corporation.