CCS811がやすかったので試しに購入してみた。アリエクスプレスで3週間前に注文したんだけど、送料合わせて4.64ドルだった。CJMCU-811っていうブレークアウト基板になっているやつ。
最近CJMCUの紫基板はプルアップ抵抗まで抵抗アレイになっている事が多いかも。ADS1115のブレークアウト基板もそうだったし。前回は抵抗アレイを外してI2Cのプルアップ以外を1005の抵抗に付け替えたけど今回は面倒なのでそのまま試してみることに。裏面は基板の品番が乗ってるだけ。i2cdetect -y 1をするとどうやらアドレスは5aらしい。2021年10月17日日曜日
CCS811をRaspberry Piで試してみた。
2021年10月13日水曜日
Raspberry Pi用にKIOXIAのmicroSDを使ってみた。
友人がRaspberry Pi Zeroでなんか作りたいようだったので初期セットアップするために借りてきた。Wじゃない方なのでCUIでセットアップする場合WiFiにつながるようにしておかないとね…
microSDカードはやすかったのでキオクシアのmicroSDにしてみた。旧東芝だから安心かなぁとおもって。並行輸入品が安くて32GBで600円しないぐらい。
中国語パケージだった。SD変換アダプタも付属してたっぽい。台湾製2021年9月26日日曜日
ArduPilotのテレメトリにTWELITEを使ってみた。
この前最近話題のドンキーカーをみて久しぶりにBeagleBoneを引っ張り出してきてArduPilotをインストールしてみたんだけど、WiFiのテレメトリでは距離が心もとないというか一旦切れると再接続がなかなかされなくてちょっと…カメラも付けたかったんだけどな…
テレメトリで悩むのは結局技適対応しているのがXbeeとTWELITEぐらいしかなさそうなところ。ESP32にDroneBridgeというのも気になるけど。Ardupilot用に技適対応テレメトリモジュールも出ているようだけど中身Xbeeとかなんじゃないかなとか思ったり(スペック的に)。Xbeeだとプログラマブルモジュールは安く手に入りそうなんだけど、テレメトリ用途だとめっちゃ扱いにくそうだし、ノーマルタイプはちょっとお高い…
ということでTWELITE(トワイライト)を試してみることに。最近TWELITE UARTっていうUART接続に特化したボードが出たっぽい。2mWのBLUEだと地上だと飛びにくいということで10mWのTWELITE RED UARTにしてみた。
ArduPilotのMAVLink v2ではパケット長がTWELITEが一回に送れる最大の80を大きく超えたりすることもある可変長なのでデフォルト設定のTWELITEでは少しきつそうだった。単純にボーレートをあわせただけだと通信が結構遅いのでいろいろ試してみた。
・無入力タイムアウト 100ms → 10ms ・オプションビット 00000100 → 00014000
あとは片方をArduPilotに接続するだけ。今回はBeagleBoneを使用したのでUT1に接続して使用した。Serial1はデフォルトでMAVLink2の57600bpsだったのでそのまま繋がるはず。
この設定でパラメータ取得が格段に早くなった。これならWPもTWELITE経由で普通に送受信できる。あとはRCバギーに乗せてArduRoverを設定するだけかな。
2021年9月25日土曜日
Arduino環境のラズパイPicoでW5500を使ってみる。
この前手持ちのENC28J60をRaspberry Pi Picoに搭載してLAN接続してみたんだけど、やっぱりネットワークに繋いだときにWebServerとか立ち上げるとIP調べるのが面倒なのでmDNSがほしい。
ということでUDPマルチキャストに対応しているW5500に変更してみた。Aliexpressで送料含めても600円ぐらい。
LANコネクタ側には緑色のLink-Up LEDと黄色のAccess LEDがついてる。LEDの抵抗はすべて2kΩが付いてるんだけど、電源の赤色LEDはいいとしてLAN端子のLEDは結構暗い。明るくするなら510Ω~1kΩぐらいに変更するといいかも。3.3V駆動だし。
//Raspberry Pi Pico
//library:
//Ethernet_Generic
//EthernetWebServer
//mDNS Generic
#include <SPI.h>
#include "Ethernet_Generic.h"
#include "EthernetUdp.h"
#include <EthernetWebServer.h>
#include <ArduinoMDNS.h>
EthernetUDP udp;
MDNS mdns(udp);
#define HTTP_PORT 80
#define CS_PIN 17
#define HOSTNAME "rp2040"
byte mac[] = { 0x52, 0x42, 0x00, 0x40, 0x30, 0x10 };
EthernetWebServer server(HTTP_PORT);
//gzip compressed arry
//https://www.mischianti.org/online-converter-file-to-cpp-gzip-byte-array-3/
//File: index.html.gz, Size: 199
#define index_html_gz_len 199
const uint8_t index_html_gz[] PROGMEM = {
0x1F, 0x8B, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x55, 0x4F, 0x4D, 0x0B, 0x82, 0x40,
0x10, 0xBD, 0x07, 0xFD, 0x87, 0xC9, 0xB3, 0xA5, 0xDE, 0xD5, 0x4B, 0x05, 0x1D, 0x8A, 0x22, 0x82,
0x08, 0xBC, 0xAC, 0x3A, 0xE4, 0xD0, 0x7E, 0xC4, 0x3A, 0x6A, 0xFE, 0xFB, 0xD6, 0x0D, 0x0F, 0xC1,
0xC0, 0x9B, 0x79, 0xF3, 0xDE, 0x7C, 0xA4, 0xAB, 0xDD, 0x79, 0x7B, 0x7B, 0x5C, 0xF6, 0x70, 0xB8,
0x9D, 0x8E, 0xF9, 0x72, 0x91, 0x36, 0xAC, 0xA4, 0x47, 0x14, 0xF5, 0x84, 0x0A, 0x59, 0x80, 0x16,
0x0A, 0x21, 0x83, 0x22, 0xE8, 0x09, 0x87, 0xB7, 0xB1, 0x5C, 0x04, 0x50, 0x19, 0xCD, 0xA8, 0xD9,
0xD3, 0x03, 0xD5, 0xDC, 0xB8, 0xAC, 0xC6, 0x9E, 0x2A, 0x5C, 0xFB, 0x32, 0x04, 0xD2, 0xC4, 0x24,
0xE4, 0xBA, 0xAD, 0x84, 0x9C, 0xEC, 0xC9, 0x26, 0x0E, 0x41, 0x89, 0x0F, 0xA9, 0x4E, 0xFD, 0x93,
0x5D, 0x8B, 0xD6, 0x33, 0xA2, 0x94, 0x98, 0xC5, 0x45, 0x30, 0x6D, 0x66, 0x62, 0x89, 0xF9, 0x55,
0xB4, 0xEF, 0x12, 0xAD, 0x1D, 0xE1, 0x42, 0x2E, 0x2A, 0x93, 0x46, 0xBF, 0x86, 0x53, 0x44, 0xF3,
0x91, 0xA5, 0xA9, 0x47, 0x7F, 0x74, 0x92, 0xDF, 0xB1, 0x04, 0x37, 0xAD, 0x47, 0x0B, 0xD4, 0xC2,
0x60, 0xEC, 0x8B, 0xF4, 0x73, 0xE5, 0xA4, 0x89, 0x77, 0xCC, 0xCA, 0xC8, 0xFF, 0xF9, 0x05, 0xE8,
0xC7, 0x44, 0xA7, 0xFF, 0x00, 0x00, 0x00
};
void setup() {
Ethernet.init (CS_PIN);
Ethernet.setHostname(HOSTNAME);
Ethernet.begin(mac);
mdns.begin(Ethernet.localIP(), HOSTNAME);
mdns.addServiceRecord("Webserver", HTTP_PORT, MDNSServiceTCP);
server.enableCORS();
server.on("/", handleRoot);
server.begin();
}
void handleRoot()
{
const char* dataType = "text/html";
server.sendHeader(F("Content-Encoding"), F("gzip"));
server.send_P(200, dataType, (const char*)index_html_gz, index_html_gz_len);
}
void loop() {
mdns.run();
server.handleClient();
}
今回はDHCPからアドレスを取得できたけど、できない場合に自動プライベートアドレスにしたりとかをやってみたい。そうすればPCと直結でIP取得できないときでもmDNSで接続できるはず。
2021年9月19日日曜日
Orange Pi PCでSPI接続のLCDを使ってみた。
Orange Pi PCでSPI接続のTFT液晶が使えるかどうか試してみることに。使用したLCDは4年前ぐらいに838円でeBayで購入したILI9341っていうLCDコントローラICを搭載した2.8インチのもの。解像度は320x240だった。おそらく秋月でも売っているMSP2807と互換かな?刻印が違うけど見た目ほぼ同じだし。
Orange Pi PCの方にはArmbian 21.08 BullseyeのCLI版を入れてある。SPI接続のTFT液晶をLinuxで使えるようにする場合、PythonとかでSPIを直接叩いてLCDに表示する方法もあるみたいなんだけど、今回はFBTFTを使用して普通のディスプレイを繋いだときと同じように使えるようにしてみた。小型TFTディスプレイ用のディスプレイドライバ的な感じなので、ドライバが読み込まれた時点からディスプレイに起動時のメッセージを表示したりもできる。
早速試してみようと思ったらなんとfbtft_deviceモジュールが入っていない…
調べてみるとfbtftは2015年から更新されておらず、GPIOの実装が変わったことにより使えなくなるので、Linux Kernel 5.4以降では削除されたらしい。
しかしながらDevice Tree Overlay経由では使えるらしい。Device Tree Overlayには最初から用意されているoverlaysとユーザーが自分で作成して使用できるuser_overlayがあるようで、今回はOrange Pi Zeroで動作確認されていたuser_overlayを改良してOrange Pi Zeroようにしてみた。
device tree overlay for small lcd
こちらのOrange Pi Zero用のdtsファイルを参考にさせてもらった。というかGPIOピンの設定とSPIの設定だけ変更するだけだった。Orange Pi ZeroはSPI1しか出てないけど、Orange Pi PCはSPI0が使えるのし。
まずはOrange Pi PCのSPIを有効にする。
sudo nano /boot/armbianEnv.txt
でArmbianの設定ファイルを開いて
overlays=spi-spidev
param_spidev_spi_bus=0
を追加する。ちなみにもうすでにoverlaysの行があったら後ろにスペースでspi-spidevを追加すればいい。(overlaysの行は2行あってはいけないので読み込みたいオーバーレイを列挙する)
あとは保存して一旦再起動。
再起動後にSPIが有効になってるか
ls /dev
で確認する。リストにspidev0.0が追加されていればSPIが有効になってる。最初にarmbian-configでSPIを有効にしたつもりが実は有効になってなくてハマったのでarmbianEnv.txtを直接編集するほうがいいかもしれない…
SPIが有効になったら次にuser_overrayの設定をする。
ili9341opizero.dtsをダウンロードしてきて、&spi1となっている2箇所を&spi0に変更する。
その編集したファイルのディレクトリで
sudo armbian-add-overlay ili9341opizero.dts
を実行する。するとoverlayファイルをコンパイルしてさらには/boot/armbianEnv.txtにuser_overlayの設定を追加してくれる。
設定が終わったのでとりあえずOrange Pi PCの電源を切る。
ILI9341な液晶をOrange Pi PCに接続する。
VCC→3.3V or 5.0V(LCDのジャンパで設定した方につなぐこと)
GND→GND
CS→PC3
RESET→PA10
DC→PA2
MOSI→PC0
SCK→PC2
LED→3.3V
MISO→PC1
LEDはバックライトなんだけど、
led-gpios = <&pio 0 6 0>;
でPA6に割り当ててfbtft側からオンオフできそうだった。しかしGPIOで直接駆動できるような電流じゃなさそうなので今回は電源に直結した。GPIOで制御するならFETとかロードスイッチ入れないとだめそう。
RESETピンとDCピンはdtsファイルを編集すれば他のピンにも割り当て可能。
LCDを繋いで電源を入れると
こんな感じでHDMIディスプレイを繋いだときみたいにそのまま使える。
GUI版を入れればそのままデスクトップが表示されるんだけど解像度が小さすぎる。フレームバッファを使用して描画できるアプリならそのまま動く。
SPIのクロックとか配線を調整すればもしかしたら動画もヌルヌル動いちゃうかな?
今回はできるだけ短い線を使用したけどこの状態だとクロック早くしすぎると表示が乱れそうである。
Device Tree Overlayはラズパイとかではそのまま用意されてるやつを使ったことがあったけど、コンパイルしてdtsファイルをdtboにしないといけないのを知らなかったりして結構ハマった…
armbian-add-overlayなんて便利なコマンドがあるのも知らなかったし。(コンパイルしてちゃんとしたフォルダに保存して読み込み設定までしてくれちゃう)
ちなみにタッチパネルはTSC2046互換のXPT2046がのってるっぽいんだけど、TSC2046の古いバージョンであるADS7846のドライバモジュールが使えるっぽい?
2021年9月11日土曜日
ラズパイでRTC-8564NBを使ってみた。
スタンドアローンのRaspberry Pi 3B用にRX8900を使ってみてたんだけど、アップデート時にモジュールをビルドし直すのが面倒になったのでデバイスツリー対応のRTCに変更してみた。
秋月で売っているRTC-8564NBならRaspberry Pi OSではpcf8563として使えるのでOSアップデート時でも安心である。というか設定するだけで使えるのはやっぱり便利ね…
よく調べてから買うべきだった(結局VBATピンついててもダイオード必要だったし。
dtoverlay=i2c-gpio,bus=6,i2c_gpio_sda=22,i2c_gpio_scl=23,i2c_gpio_delay_us=1
dtoverlay=i2c-rtc-gpio,pcf8563,i2c_gpio_sda=22,i2c_gpio_scl=23
2021年9月2日木曜日
microSDが修理から帰ってきた
まぁ修理と言っても交換なんだけど…
というわけで前回サポセンに連絡してクリックポストで送付したmicroSDが帰ってきた。在庫の関係上同じモデルだけど新しいやつに変わっていた。Evo+からEvo Plusに変更に。
読み方は同じなんだろうけど…より読みやすくしたのかな。
裏面を見る限り並行輸入品にありがちな海外パッケージ品?
















