ラベル python の投稿を表示しています。 すべての投稿を表示
ラベル python の投稿を表示しています。 すべての投稿を表示

2021年8月25日水曜日

Lichee Pi Zeroで無線LANを使いたい ESP8266 その1

Lichee Pi向け?の無線LANモジュールはあるみたいだけど、TELEC取得していないので
普通に使うことはできない。
そこで、気にはなっていたけど使ったことがなかったESPを最近使い始めたので、調子に乗ってLicheePIと接続してみたいと思う。
ESP8266(ESP-WROOM-02D (2MB))

UART1を有効にする

コミニュティの手順書を参考にUART1を有効にする
http://zero.lichee.pro/驱动/UART.html

ブロック図では
http://zero.lichee.pro/入门/board_intro.html#id5

IO-E21、IO-E22の割り当てをUART1に変更できる


dts、dtsiファイルの変更

手順書では、sun8i-v8s.dtsiやsun8i-v3s-licheepi-zero.dtsを書き換える手順になっているが、変更箇所を分離して自分の管理下に置きたかったので、別ファイルに記載することにした。

buildrootの外部ツリーに
board/dts/sun8i-v3s-licheepi-zero-dock-with-lcd.dts
を作成


#include "sun8i-v3s-licheepi-zero-dock.dts"

/ {
	backlight: backlight {
		compatible = "pwm-backlight";
		pwms = <&pwm 0 1000000 0>;
		brightness-levels = <0 30 40 50 60 70 100>;
		default-brightness-level = <6>;
	};

	soc {
		pio: pinctrl@01c20800 {
			uart1_pins_a: uart1@0 {
				pins = "PE21", "PE22";
				function = "uart1";
				bias-pull-up;
			};
		};
	};
};

&pwm {
	pinctrl-names = "default";
	pinctrl-0 = <&pwm0_pins>;
	status = "okay";
};

&uart1 {
	pinctrl-0 = <&uart1_pins_a>;
	pinctrl-names = "default";
	status = "okay";
};

これを読むようにconfigファイルを変更(menu menuconfig)する

BR2_LINUX_KERNEL_CUSTOM_DTS_PATH="$(BR2_EXTERNAL_LICHEEPI_ZERO_DOCK_EX_PATH)/board/dts/sun8i-v3s-licheepi-zero-dock-with-lcd.dts"

dtsとdtbの相互変換

device-tree-compiler が必要

dtsからdtb

#!/bin/bash

LINUX_KERNEL_SRC=output/build/linux-zero-4.14.y
DTS_SRC_FILE=$1
DTB_OUT_FILE=${DTS_SRC_FILE%.*}.dtb

gcc -E -P -x assembler-with-cpp -I $LINUX_KERNEL_SRC/arch/arm/boot/dts -I $LINUX_KERNEL_SRC/include $DTS_SRC_FILE | dtc -I dts -O dtb -i $LINUX_KERNEL_SRC/arch/arm/boot/dts -o $DTB_OUT_FILE

dtbからdts

作成されたdtbが意図したものになっているかを確認する

dtc -I dtb -O dts -o result.dts sun8i-v3s-licheepi-zero-dock-with-lcd.dtb

動作確認

適当なシリアルターミナルをインストールして確認する
今回はminiconにしてみた
uart1をループさせて、入力したものが返ってくるかを確認する

Lichee PiからESP8266のファーム書き込み

ファーム書き換えの毎にPCに接続するのも大変なので、LicheePiから書き込めるようにする

これには、esptool.pyを使用するとできるようだ
流れとしてはVScodeやArduino IDEでコンパイル→生成したバイナリをLicheePIに転送→LicheePiからESP8266を書き換える といった流れ

まずは、Arduinoは作成したファーム(バイナリ)が残らない?ので、残す方法
以下を参考にやってみる
https://www.jh4vaj.com/archives/8548

Arduino IDEの場合

スケッチ→コンパイルしたバイナリを出力



ワークスペースに[〜〜.ino.generic.bin]というファイル名でバイナリが作成される

VScodeの場合

/home/adeno/.arduino15/preferences.txt

build.path=/home/adeno/develop/Arduino/

を追加すると
コンパイル時にここにバイナリを保存しておいてくれる
このときのファイル名は[〜〜.ino.bin]というファイル名でバイナリが生成させる

方法によって、ファイル名が異なるので注意が必要。。

書き込み

esptool.py --port /dev/ttyS1 write_flash 0x0 sketch_mar29a.ino.bin

こんな感じでどーんっ
これで、ようやく環境が出来た、、まだ先は長い



2021年8月17日火曜日

ESP-WROOM-02D(ESP8266)を使ってみる1

安価に無線LANモジュールを入手出来ないかと模索中。 Lichee Pi Zeroにつなげたいじゃん。
ESP-WROOM-02D https://akizukidenshi.com/catalog/g/gM-13289/とか安いじゃん @360
開発ボード https://www.digikey.jp/product-detail/ja/espressif-systems/ESP8266-DEVKITC-02D-F/1965-1001-ND/9649768

技適も問題なし。


本当は、今年の3月くらいにやっていたのだけど、なぜかブログにアップするのを忘れていた。
なんだかなー。

準備

用意したもの

※フラッシュメモリの容量は2MB

ドキュメント

書き込みツール

  • windowsはESPFlashDownloadTool
  • pythonツールもある[rsptool.py]

SDKなど

技適のメモ

カスタムファームでの技適問題はスイッチサイエンスさんが確認してくれている
https://mag.switch-science.com/2016/01/20/esp-wroom-02_telec/

なので、

ファーム 技適
The official AT firmware (ESP8266_NONOS_SDK) OK
RTOS (ESP8266_RTOS_SDK) OK
Arduino core for ESP8266 WiFi chip OK
MicroPython ?
FreeRTOS https://github.com/aws/amazon-freertos ?

初期ファームで起動・最新バージョンに書き換え

ready
AT+GMR
AT+GMR
AT version:1.6.2.0(Apr 13 2018 11:10:59)
SDK version:2.2.1(6ab97e9)
compile time:Jun  7 2018 19:34:26
Bin version(Wroom 02):1.6.2
OK

Quick Start Guideの手順書通りにファーム書き換え、windowsが必要になったけどね。。
rsptool.py使えば、linuxでもできる気がするけど試していない。

ready
AT+GMR
AT+GMR
AT version:1.7.4.0(May 11 2020 19:13:04)
SDK version:3.0.4(9532ceb)
compile time:May 27 2020 10:12:22
Bin version(Wroom 02):1.7.4
OK

The official AT firmwareでhttpリクエストしてみる

ATコマンドを駆使してhttpリクエストをやってみる
ATコマンドは
https://www.espressif.com/sites/default/files/documentation/4a-esp8266_at_instruction_set_en.pdf
https://www.espressif.com/sites/default/files/documentation/4b-esp8266_at_command_examples_en.pdf
を参考にした

今勉強中のPythonでやってみる
pyserialを使うので

pip3 install pyserial

が必要。

テスト用プログラム

import serial
import threading
import time
import io

busy_flg = False
rcv_flg = True

def _rcv() :
    global busy_flg
    global rcv_flg
    global sio
    while rcv_flg:
        rawline = sio.readline()
        line = rawline.replace("\r","").replace("\n","")
        if (line == "OK") or (line == "SEND OK") :
#            print("Found \"OK\".")
            busy_flg = False
        elif (line == "FAIL") or (line == "ERROR") :
#            print("Found \"FAIL\" or \"ERROR\".")
            busy_flg = False

        if len(line) > 0 :
            print(line)

def _send(data,nocr=False) :
    global busy_flg
    global sio
    while busy_flg == True :
        time.sleep(1)
        print("*")
    busy_flg = True

    print("snd>"+data)
    if nocr:
        sio.write(data)
    else :
        sio.write(data+"\r\n")
    sio.flush()


ser = serial.Serial('/dev/ttyUSB1',115200,timeout=0.5)
sio = io.TextIOWrapper(io.BufferedRWPair(ser, ser))

rcv_thread = threading.Thread(target=_rcv)
rcv_thread.daemon = True
rcv_thread.start()

try:
    _send(data = "AT+GMR")

    _send(data = "AT+CWMODE=1")     # Station mode 
    _send(data = "AT+CWLAP")        # Lists Available APs
    _send(data = "AT+CWJAP_CUR=\"[ESSID]\",\"[password]\"")        # Connects to an AP

    _send(data = "AT+CIFSR")        # Gets the local IP address 
    _send(data = "AT+CIPSTA?")  

    _send(data = "AT+CIPSNTPCFG=1,9,\"pool.ntp.org\",\"jp.pool.ntp.org\"") # Sets the Configuration of SNTP 
    _send(data = "AT+CIPSNTPTIME?") # Checks the SNTP Time

    _send(data = "AT+CIPSTART=\"TCP\",\"203.137.163.123\",80")        #protocol,server IP and port
    
    http_body="GET / HTTP/1.0\r\n"
    http_body+="\r\n\r\n"
    http_body_length = len(http_body)

    _send(data = "AT+CIPSEND="+str(http_body_length))
    _send(data = http_body,nocr=True)
    time.sleep(10)

    _send(data = "AT+CIPCLOSE")
    _send(data = "AT+CWQAP")        # Disconnects from the AP 

except KeyboardInterrupt:
    print("Bye.")
    

print("Exit.")
busy_flg = False
rcv_flg = False
rcv_thread.join()
ser.close()

やってること

ATコマンドを順に実行している。エラー処理などは未実装。

  1. バージョン表示
  2. ステーションモード(STA)に変更
  3. アクセスポイント(AP)を検索
  4. APに接続
  5. APからもらったIPアドレスなどを表示
  6. NTPサーバーを設定(“pool.ntp.org”,“jp.pool.ntp.org”)
  7. NTPサーバーから時刻を取得
  8. WEBサーバーに接続(今回は、自分のグローバルIPアドレスを確認できるサービス http://ipaddr.show/ のIPを設定[203.137.163.123])
  9. WEBサーバーにリクエスト送信
  10. 10秒待つ
  11. TCPセッション切断
  12. APから切断

実行結果

adeno@drakorange:~/develop/ESP8266$ python3 test.py 
snd>AT+GMR
AT+GMR
AT version:1.7.4.0(May 11 2020 19:13:04)
SDK version:3.0.4(9532ceb)
compile time:May 27 2020 10:12:22
Bin version(Wroom 02):1.7.4
OK
*
snd>AT+CWMODE=1
AT+CWMODE=1
OK
*
snd>AT+CWLAP
AT+CWLAP
*
*
+CWLAP:(4,"****************",-79,"**:**:**:**:**:**",1,5,0,4,4,7,1)
(省略)
OK
*
snd>AT+CWJAP_CUR="SSID","PASSWORD"
AT+CWJAP_CUR="SSID","PASSWORD"
*
*
*
WIFI CONNECTED
*
*
WIFI GOT IP
OK
*
snd>AT+CIFSR
AT+CIFSR
+CIFSR:STAIP,"192.168.1.19"
+CIFSR:STAMAC,"**:**:**:**:**:**"
OK
*
snd>AT+CIPSTA?
AT+CIPSTA?
+CIPSTA:ip:"192.168.1.19"
+CIPSTA:gateway:"192.168.1.1"
+CIPSTA:netmask:"255.255.255.0"
OK
*
snd>AT+CIPSNTPCFG=1,9,"pool.ntp.org","jp.pool.ntp.org"
AT+CIPSNTPCFG=1,9,"pool.ntp.org","jp.pool.ntp.org"
OK
*
snd>AT+CIPSNTPTIME?
AT+CIPSNTPTIME?
+CIPSNTPTIME:Wed Mar 31 06:19:39 2021
OK
*
snd>AT+CIPSTART="TCP","203.137.163.123",80
AT+CIPSTART="TCP","203.137.163.123",80
CONNECT
OK
*
snd>AT+CIPSEND=20
AT+CIPSEND=20
OK
*
snd>GET / HTTP/1.0



> 
Recv 20 bytes
SEND OK
+IPD,133:HTTP/1.0 200 OK
Date: Tue, 30 Mar 2021 21:19:43 GMT
Content-Length: 16
Content-Type: text/plain; charset=utf-8
***.***.***.***
CLOSED
snd>AT+CIPCLOSE
AT+CIPCLOSE
ERROR
*
snd>AT+CWQAP
Exit.
AT+CWQAP

いい感じ
なんとなく、わかってきた。

2021年3月21日日曜日

Lichee Pi Zeroのソフト開発環境構築6

ようやくバージョンアップの手段を準備できたので、「ソフト開発環境」の準備の入り口を作りたい。

プログラム作成→実行までを考える

簡単なものとして、シェルスクリプトを作成して、LicheePi側で実行したい場合

VScode

とりあえずこれがPC側に
あとは拡張機能をいくつか

SFTP
SSH FS

LicheePi側

sshサーバー

これが無いと始まらないかな。
軽微な修正時に、シリアルコンソールの出番を減らせるし!

BR2_PACKAGE_DROPBEAR

sftpサーバー

これも、入れておくと、VSCodeから更新が簡単にできる!

BR2_PACKAGE_GESFTPSERVER

これで、プログラム作成からファイル転送、実行までVSCode内で完結できる!素敵!


 

ちょっとしたGUIインターフェースにTck/Tk

なつかしー

BR2_PACKAGE_TK
BR2_PACKAGE_TCL

ちょっとしたGUIが簡単に?できるのは素晴らしいと思う。


 

今は、環境構築すすめているので、詳細は別途まとめる

これで、シェルスクリプトの環境がなんとなく整った。
あとは、必要に応じて入れていこうかな、pythonやc/c++が候補。

Python

Lichee Piのスペックで動くか知らないけど、とりあえず入れてみる。

BR2_PACKAGE_PYTHON3

TKINTERは・・・?
https://sourceforge.net/p/armadeus/code/ci/master/tree/patches/buildroot/2017.02/012-armadeus-add-tkinter-support-to-python.patch
を参考に、書き換えてみた。

patch ../../../package/python3/Config.in < 0001-add-tkinter-support-to-python3_Config.in.patch 
patch ../../../package/python3/python3.mk < 0002-add-tkinter-support-to-python3_python3.mk.patch 
--- Config.in	2020-10-12 21:55:06.000000000 +0900
+++ Config.in	2020-12-28 19:28:44.925240000 +0900
@@ -82,6 +82,18 @@
 	help
 	  _ssl module for Python3 (required for https in urllib etc).
 
+config BR2_PACKAGE_PYTHON3_TKINTER
+	depends on BR2_PACKAGE_XORG7
+	depends on BR2_PACKAGE_TCL
+	select BR2_PACKAGE_TK
+	bool "tkinter"
+	help
+	  Tkinter module for Python3.
+
+comment "tkinter needs a X server and tcl"
+	depends on !BR2_PACKAGE_XORG7
+	depends on !BR2_PACKAGE_TCL
+
 config BR2_PACKAGE_PYTHON3_UNICODEDATA
 	bool "unicodedata module"
 	default y
--- python3.mk	2020-12-28 19:29:41.261031000 +0900
+++ python3.mk	2020-12-28 19:30:25.632867000 +0900
@@ -124,6 +124,12 @@
 PYTHON3_CONF_OPTS += --disable-ossaudiodev
 endif
 
+ifeq ($(BR2_PACKAGE_PYTHON3_TKINTER),y)
+PYTHON_DEPENDENCIES += tk
+else
+PYTHON_CONF_OPTS += --disable-tk
+endif
+
 # Make python believe we don't have 'hg', so that it doesn't try to
 # communicate over the network during the build.
 PYTHON3_CONF_ENV += \
@@ -157,7 +163,6 @@
 	--disable-pydoc \
 	--disable-test-modules \
 	--disable-lib2to3 \
-	--disable-tk \
 	--disable-nis \
 	--disable-idle3 \
 	--disable-pyc-build

これで、menuconfigに

BR2_PACKAGE_PYTHON3_TKINTER
が表示される

buildrootのconfig.inやmkファイルにパッチをあてる方法がよくわからない。
なので、手動でパッチをあてた。

#!/bin/bash


apply(){
    patch ../../../package/python3/Config.in < 0001-add-tkinter-support-to-python3_Config.in.patch 
    patch ../../../package/python3/python3.mk < 0002-add-tkinter-support-to-python3_python3.mk.patch
}

redo(){
    patch -R ../../../package/python3/Config.in < 0001-add-tkinter-support-to-python3_Config.in.patch 
    patch -R ../../../package/python3/python3.mk < 0002-add-tkinter-support-to-python3_python3.mk.patch
}

echo "----------------------------------------"
echo " add tkinter support to python3."
echo "----------------------------------------"
case "$1" in
    apply|redo)
		"$1";;
    *)
		echo "Usage: $0 {apply|redo}"
		exit 1
esac