2022年1月25日火曜日

2021年を振り返って

気がつくともう2022年ですね。
しかも1月が終わろうとしている。
今年も新型コロナウイルスに右往左往した1年でした。
引き続き、感染予防対策を怠らず、気を引き締めて、生活したい。

新しい生活スタイルにも慣れたけれど、さらに環境の変化があったりと面白い1年だった。
いろいろあって、8月以降はまったく更新できなかったけど。

技術的なことで頑張ったのは

毎年の事だけど、昨年頑張ったのは、、、

  1. Lichee PI Zero と ESP8266を使ってみる
      →これはかなり勉強になっている。直接仕事には関わらないので趣味の領域だけど
      色々カスタマイズしながら作っている感じが面白いね。

  2. 他なんかあったっけ?
    リモート環境のためにChromeBookとかノイキャンイアホン用意したり
    スキマ時間を見つけてなにかできるようにした

感想

沼から這い出ようとすると、空から泥を降ってくるような笑える1年だったけど、なんだかんだ、必死に頑張った1年だった
新しいことに挑戦するために一歩踏み出した。 時間は有限だ。
でも、そろそろ転職がいいのかもしれない。でもまだ頑張れそうな気もするし。。。悩ましいが、年齢的にも猶予はない。

技術以外では、昨年と同じように、ほぼ毎日のようにジジババと孫がWEBでおしゃべりしている

来年(今年)も引き続き家庭も仕事も趣味も充実するといいな。
目標は
・戦略的な投資
・やりたいことをためらわずにやる
・家庭-仕事-趣味のバランスと充実を目指す
・「巨人の肩に乗る」
・広くつながる
・頑張り過ぎないことを頑張る
去年とあまり変わらないか・・・。

子育て世帯の苦労が少しでも良くなりますようにー

今年も精一杯挑戦して続けていこう!

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月18日水曜日

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

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



official AT firmwareでATコマンドを駆使した簡単なhttpリクエストは成功したので
少し調子に乗って、Arduino core for ESP8266 WiFi chipを使って同じようなことをしてみたい。
初めてArduino使うわ。
なので、Arduino環境の構築から。

Arduino環境構築

この手順に従ってやっていく
https://github.com/esp8266/Arduino#installing-with-boards-manager

参考
https://www.indoorcorgielec.com/resources/arduinoide設定/esp-wroom-02搭載製品
https://keijirotanabe.github.io/blog/2017/02/07/esp8266-Arduino-170207/

Arduino IDE

https://www.arduino.cc/en/software

今回は、ディストリビューションのソフトウェア管理からインストールしちゃう。
apt install

後のVScode連携でハマった(IDEの場所をVSCodeから見つけられない)ので、
公式からインストールすることにした。
https://www.arduino.cc/en/Guide/Linux

ボードマネージャーに追加

https://arduino.esp8266.com/stable/package_esp8266com_index.json

HelloWorld

巷のサンプルのままだけど。

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
}

void loop() {
  // put your main code here, to run repeatedly:
  Serial.println("Hello World");
  delay(1000);
}


これがArduinoかー。わずか3行でこんなことができちゃうんだ。すごい世界観だ。

VSCode

なにやら、VSCodeの拡張機能があるみたい。すてき。
https://github.com/Microsoft/vscode-arduino
https://qiita.com/narikei/items/847613a8f01a9e1527d7#arduinoに書き込む
https://qiita.com/kamata1729/items/10226444bc89e2533e4f

上記を参考に導入。


Arduinoでhttpリクエストしてみる

Arduinoはサンプルコードがいっぱいある。
参考にテストコードを作成

#include <ESP8266WiFi.h>
#include <time.h>

WiFiClient client;

void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  testRun();
}

void printScanResult(int networksFound)
{
  Serial.printf("%d network(s) found\r\n", networksFound);
  for (int i = 0; i < networksFound; i++)
  {
    Serial.printf("%d: %s, Ch:%d (%ddBm) %s %s\r\n", 
      i + 1, WiFi.SSID(i).c_str(), WiFi.channel(i), WiFi.RSSI(i), 
      WiFi.encryptionType(i) == ENC_TYPE_NONE ? "open" : "",WiFi.BSSIDstr(i).c_str());
  }
  Serial.printf("End\r\n");
}

void show_WifiStatus(){
  char result[32];
  switch(WiFi.status()){
    case WL_CONNECTED:
      strcpy(result,"connection is established.");
      break;
    case WL_NO_SSID_AVAIL:
      strcpy(result,"SSID cannot be reached.");
      break;
    case WL_CONNECT_FAILED:
      strcpy(result,"connect failed.");
      break;
    case WL_IDLE_STATUS:
      strcpy(result,"idle.");
      break;
    case WL_DISCONNECTED:
      strcpy(result,"disconnect.");
      break;
    default:
      strcpy(result,"unknown.");
      break;
  }
  Serial.printf("Connection status: %s\r\n",result);
}

void testRun(){
  Serial.printf("Scan AP\r\n");
  delay(100);
  WiFi.scanNetworksAsync(printScanResult);
  
  delay(10000);
  const char ssid[] = "************";
  Serial.printf("Connect AP\r\n");
  show_WifiStatus();
  Serial.printf("Connecting to %s\n", ssid);
  WiFi.begin(ssid, "************");
  show_WifiStatus();
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  show_WifiStatus();
  Serial.print("Connected, IP address: ");
  Serial.println(WiFi.localIP());
  configTzTime("JST-9", "pool.ntp.org", "jp.pool.ntp.org"); 

  delay(10000);

  time_t t;
  struct tm *tm;
  static const char *wd[7] = {"Sun","Mon","Tue","Wed","Thr","Fri","Sat"};

  t = time(NULL);
  tm = localtime(&t);
  Serial.printf("ESP8266 :  %04d/%02d/%02d(%s) %02d:%02d:%02d\r\n",
        tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday,
        wd[tm->tm_wday],
        tm->tm_hour, tm->tm_min, tm->tm_sec);

  delay(3000);
  Serial.println("\r\nStarting connection...");
  if (client.connect("httpbin.org", 80)) {
    Serial.println("connected");
    // Make a HTTP request:
    client.println("GET /ip HTTP/1.0");
    client.println();

    delay(3000);
    while(client.available()) {
      String line = client.readStringUntil('\r');
      Serial.print(line);
    }

    client.stop();
  }

  WiFi.disconnect();
  delay(3000);
  show_WifiStatus();
}

void loop() {
  delay(500);
}

なんとなく、わかったような。。
久しぶりにCだなぁ。