本記事を書くきっかけ
以前、Raspberry Pi Pico(以降 パイピコ)で、Sigfox 通信を実現する記事を記載しました。
https://qiita.com/kataoka_se/items/293c7d7a2e466f1f5f65
上記の記事では、uart0 と Sigfox モジュールを接続し、シリアル通信で機能実現を行ったのですが、より入り組んだコードを組む上でとりあえずログぐらいは取れるようにしようと printf() の内容を USB 経由で PC に転送させたところ、そのUSBからのログと uart0 の通信が混雑してしまい、まともに動かない状態になりました。
より詳しく説明すると、uart0 に "AT$I=10\r"
という ATコマンドを送ると、Sigfoxモジュールから デバイスID が返ってくるのですが、それを USB経由でログを出力しようとすると、そのログが再度 uart0 にも流れてしまい Sigfox モジュールから "Parse Error" というレスポンスが返ってきてしまうので、使い物にならないのです。
その解決策を模索したところ、パイピコには UART が2系統あるで、一つを Sigfoxモジュールの通信用とし、もう一方をログ出力用としようと考えました。
パイピコの uart
パイピコには、uart が2系統搭載されています。
https://www.switch-science.com/catalog/6900/
今回の実験では、uart0 に Sigfox モジュールを接続し、uart1 の USB - TTLシリアルアダプター を接続しPCからログを確認します。
使用した機材
- Raspberry Pi Pico
- Sigfox Break Out Board(Sigfoxモジュール)
- DSD TECH SH-U09C USB - TTLシリアルアダプター + FTDI FT232RLチップ
構成と接続
Sigfoxモジュールとパイピコ、TTLシリアルアダプターとパイピコはそれぞれ下記のポートを接続します。
パイピコ UART | パイピコ 物理的ピン番号 | GPIOピン番号 | 接続先 |
---|---|---|---|
UART0_TX | 1 | 0 | Sigfox モジュール RX |
UART0_RX | 2 | 1 | Sigfox モジュール TX |
UART1_TX | 6 | 4 | TTLシリアルアダプター RX |
UART1_RX | 7 | 5 | TTLシリアルアダプター TX |
- Sigfox モジュール は、パイピコから 3.3V と GND を取ります
- TTLシリアルアダプターは、GND だけでOKです
ソースコード
#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/uart.h"
#define UART_ID_SIGFOX uart0
#define UART_ID_TTL uart1
#define BAUD_UART_0_RATE 9600
#define BAUD_UART_1_RATE 115200
#define UART_SIGFOX_TX_PIN 0
#define UART_SIGFOX_RX_PIN 1
#define UART_TTL_TX_PIN 4
#define UART_TTL_RX_PIN 5
int main() {
stdio_init_all();
uart_init(UART_ID_SIGFOX, BAUD_UART_0_RATE);
uart_init(UART_ID_TTL, BAUD_UART_1_RATE);
gpio_set_function(UART_SIGFOX_TX_PIN, GPIO_FUNC_UART);
gpio_set_function(UART_SIGFOX_RX_PIN, GPIO_FUNC_UART);
gpio_set_function(UART_TTL_TX_PIN, GPIO_FUNC_UART);
gpio_set_function(UART_TTL_RX_PIN, GPIO_FUNC_UART);
uart_puts(UART_ID_TTL, "Sigfox - Dual UART\n");
sleep_ms(1000 * 10);
while (true) {
uart_puts(UART_ID_SIGFOX, "AT$I=10\r");
sleep_ms(10);
uart_puts(UART_ID_TTL, "Device ID : ");
while (uart_is_readable(UART_ID_SIGFOX)) {
char ret = uart_getc(UART_ID_SIGFOX);
uart_putc(UART_ID_TTL, ret);
}
sleep_ms(1000);
}
return 0;
}
Tera Term で接続
今回、パイピコ側のボーレートを 115200 に設定しているので、Tera Term 側で速度を合わせて接続。
無事に、UART0 経由で取得した、Sigfox モジュールの Device ID を UART1 にシリアル転送して PC上(Tera Term)確認することができました。
気が付いてしまった事
ここまでやってようやく気が付いたのですが、uart0 と usb が混線するなら、Sigfox を uart1 に接続して、ログ出力を usb からとればいいのでは?と今更気が付きました。
実際やってみると、下記のコードで Sigfox モジュール と UART 通信しながら、USB からログを取得できました。
#include <stdio.h>
#include "pico/stdlib.h"
#include "hardware/uart.h"
#define UART_ID_SIGFOX uart1
#define BAUD_UART_1_RATE 9600
#define UART_SIGFOX_TX_PIN 4
#define UART_SIGFOX_RX_PIN 5
int main() {
stdio_init_all();
char response[1024];
int ptr = 0;
uart_init(UART_ID_SIGFOX, BAUD_UART_1_RATE);
gpio_set_function(UART_SIGFOX_TX_PIN, GPIO_FUNC_UART);
gpio_set_function(UART_SIGFOX_RX_PIN, GPIO_FUNC_UART);
printf("Sigfox - UART with USB\n");
sleep_ms(1000 * 10);
while (true) {
uart_puts(UART_ID_SIGFOX, "AT$I=10\r");
ptr = 0;
sleep_ms(10);
while (uart_is_readable(UART_ID_SIGFOX)) {
char ret = uart_getc(UART_ID_SIGFOX);
response[ptr++] = ret;
}
response[ptr] = '\0';
printf("Device ID : %s", response);
sleep_ms(1000);
}
return 0;
}
uart1 から受信したデータの扱いが雑ですが、動作確認目的なのでご容赦ください。