タグ別アーカイブ: UART

Raspberry Pi A+ UART GATEWAY

Raspberry Pi A+でUSB Serial ComverterとOnboardのUARTとをGatewayするプログラムを作成しました。

UARTは、RS232Cレベルで通信するためアナログデバイセズのドライバIC ADM3202を使用しました。
https://www.analog.com/jp/products/adm3202.html

OnboardのUARTをプログラムで使用するときは、コンソールでの使用を無効にする必要上がります。
sudo raspi-config
でシリアル接続上のシェルとカーネルのメッセージを無効にします。以下のURLに詳しい記載があります。
https://www.raspberrypi.org/documentation/configuration/raspi-config.md

双方向にデータのやり取りができました。
サンプルプログラムは、以下にあります。
https://github.com/jendo1969/pydir/blob/master/UART/serialtest.py

Raspberry Pi A+ UPDATE

Raspberryを最新のOSに乗せ換えました。
OSのRasbianは、以下からダウンロードしました。
https://www.raspberrypi.org/downloads/raspbian/
今回は、DESKTOPとして使用しないので軽い以下のOSを選択しました。
https://www.raspberrypi.org/downloads/raspbian/
Raspbian Stretch Liteをダウンロードします。
Raspbian Stretch Lite Minimal image based on Debian Stretch
Version: November 2018 Release date: 2018-11-13

WindowsでSDカードに書き込んだので
Win32 Disk Imager
を使用して書き込みました。
起動して設定を進めるためシリアル通信TTYのターミナルで設定を進めました。

まずは、ネットにつなげるためWiFiの設定をしました。
WiFiは、USBドングルのPLANEX GW-USNano2を使用しました。
まずWiFiの設定を行います。
$wpa_passphrase SSID PASSWORD
このコマンドで設定が取得できます。
network={
ssid=”SSID”
psk=PASSWORDの暗号コード
}

$sudo nano /etc/wpa_supplicant/wpa_supplicant.conf
テキストエディタで設定ファイルを編集します。
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
ssid=”SSID”
psk=PASSWORDの暗号コード
key_mgmt=WPA-PSK
proto=WPA
pairwise=TKIP CCMP
priority=2
scan_ssid=1
}

続いてネットワークの設定を行います。
$cd /etc/network
$sudo nano interfaces
設定ファイルを編集します。

auto wlan0
allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

再起動します。
$sudo reboot

再起動後、IPアドレスの設定を確認します。
$ifconfig -a
IPアドレスが取れていることを確認します。

インターネットが接続できるようになったので、最新の状態に変更します。
$sudo apt-get update
$sudo apt-get upgrade

LANがつながるのでSSHを有効にします。
Raspberry PIの背帝プログラムを起動します。
$sudo raspi-config
メニューから ”5 Interfacing Options”を選択
“P2 SSH”を選択
これで、SSHが使用できるようになりシリアルで接続しなくてよくなります。

C2000 Delfino MCUs F28377S LaunchPad SCI INTERRUPT

C2000 Delfino MCUs F28377S LaunchPad + XBEE

C2000 DelfinoのUART Bを介してXBeeを使用しました。
controlSUITEのサンプルプログラムをsci_echoback_cpu01改造しています。
注意としてF28377S LaunchPadを使用するので、プロジェクトのプロパティのPredefine SymbolsのPre-define Nameに_LAUNCHXL_F28377Sを追加しないとシステムクロックが200MHzにならず、クロックの計算が合わなくなります。

このサンプルは、割り込みを使わず、エコーバックするプログラムです。

サンプルプログラムは以下にあります。
https://github.com/jendo1969/Delfino/blob/master/sci_echoback_cpu01/Example_2837xSSci_Echoback.c

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 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 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 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

© 2014 Spineedge Corporation.