JUGEMテーマ:電子工作


ESP32で電力測定したくて、秋月から電流センサーを買ったんですが、
 高精度電流センサー(CTセンサー) 分割型 Φ10mm
 [SR-3704-150N]通販コード P-08960
その前にESP32のADCの使い方の研究です。
普通につないでやってみたけどうまく行かなくて
センサーとつながないで
可変抵抗で分圧して
 

 
測定しても誤差が平気で100とかなるので、
こんなの使えねーじゃんとか色々やってみたところ、
100回程度の平均にすれば、そんなに誤差でないことが判明しておりますので
この方法でなんとか出来ると思いました。
 
あと、下に書きましたが減衰率が指定出来て、
ATTN_11DBにすれば、3.3V入れても大丈夫っぽいので、
このほうが回路も楽になります。
ESPは1.1Vまでしか測れませんってずっと前にESP8266で試したときから
思い込んでおりましたのでこれは僥倖ですね。
 
■adc0.width(machine.ADC.WIDTH_12BIT)
 解像度と言うのだろうか?
 ESP32の場合ADCで取得する値が12BITが最大なんで普通はそのまま使えばいいんだと思うんですが
 その解像度を調整できるみたい。
 machine.ADC.WIDTH_9BIT 0~511  
 machine.ADC.WIDTH_10BIT 0~1023  
 machine.ADC.WIDTH_11BIT 0~2047  
 machine.ADC.WIDTH_12BIT 0~4095 (デフォルト)
 デフォルトが12BITなので特に調整していないです。
 
■adc0.atten(machine.ADC.ATTN_11DB)
 
 減衰率とのことで、デフォルトのATTN_0DBだと、
 1Vぐらいで4095になっちゃうところを調整できるみたい。
 レンジの設定ですね。
 
 ATTN_11DBにすると、3.3Vで取得できる値が4095になるっぽいですね。
 
 そのほかにも以下のものが設定できるメモ
 machine.ADC.ATTN_0DB  0dB    (デフォルト)
 machine.ADC.ATTN_2_5DB 2.5dB     
 machine.ADC.ATTN_6DB  6dB     
 machine.ADC.ATTN_11DB 11dB
 

■ソース

 

import utime
import machine

pin36=machine.Pin(36, machine.Pin.IN)
adc0 = machine.ADC(pin36)
adc0.atten(machine.ADC.ATTN_11DB)

while True :
        val = 0
        min = 4096
        max = 0
        for i in range(50):
          total = 0
          count = 0
          for i in range(240):
                val = adc0.read()
                total = total + val
                count = count + 1
          try :
            ave = total / count
            if( min > ave) :
                min = ave
            if( max < ave) :
                max = ave
          except:
            print("dev-err")
        pp = max - min
        print(str(min)+"-"+str(max))

 


JUGEMテーマ:電子工作


Taidacent ESP32 ESP32-CAM ESP32CAM OV2640 cmosカメラモジュール広角ナイトビジョン150度2画素24ピン
 
ESP32カメラの画角が狭くて監視用としてはいまいちだったので、
悩んでおりましたが、
画角が広いカメラをaliexpressで見つけてしまいましたので
ポチーしておきましたのが届いたので、
取り付けてみました。
 

 
商品は「Taidacent ESP32 ESP32-CAM ESP32CAM OV2640 cmosカメラモジュール広角ナイトビジョン150度2画素24ピン」
ナイトビジョンって書いてあるし、暗くても映るといいなーなんて思っております。
 
 
■結果。
 
・もともとの画角
 

 
・新しい画角
 

 
 ま、ざっと3倍ぐらい写っていますね。
 合格です。
 
あとはナイトビジョンの部分ですが、あんまりわかんないですね。
同じ設定ではむしろ暗く映っております。
しばらく使ってみるとします。
 

さくらインターネットでMySQLを初めて使ったら、DB接続文字列で少しはまった件メモ 特にどうと言うことではない

 

さくらインターネットの場合に限らないのかもしれないので基本の「き」のぐらいのたぶん初歩的つまづきと思うので
メモです。

 

さて、
接続文字列の作り方だが、DBのお名前、サーバーのお名前、ユーザーID、パスワードの4つの要素が必要で、
まずはソースをあげるがそれをどこから持ってくればいいのかを書いてみた。
以下の①~④に注目です。
※ちなみに、さくらのレンタルサーバーなので他のは異なるかもです。

 

■ソース

 

use DBI;
my $database = 'xxxxxxxxxxdatabase';  ←①
my $host = 'mysqlxxxxxxsakura.ne.jp'; ←②
my $userid = 'user'; ←③
my $pass = 'pass'; ←④
my $data_source = "dbi:mysql:database=$database;host=$host";
my $dbh = DBI->connect($data_source, $userid, $pass);

my $sth = $dbh->prepare("select * from sensor_table;");
$sth->execute;

while (my @row = $sth->fetchrow_array) {
  print join(', ', @row), "¥n";
}

$dbh->disconnect;


■さくらのレンタルサーバーのコンパネページのデータベースの画面

 


■さくらのコンパネページのデータベースにたどり着くまで

 

 


JUGEMテーマ:電子工作
 

MYDNSのページによるとHTTPでアクセスすると、アクセス元のIPアドレスがMyDNSに通知されます。

 

■今回やりたいことはMyDNSに対して定期的に自動で通知してくれる様にすることです。
 今回もESP32のMicropythonで作っていきます。
 パソコンのメールで通知していたんだけど、留守にしていると通知が出来なくて、
 ある日、アクセスできなくなったりして復旧するのに苦労したりしますので。
 電源が入っている限りは自動通知してくれるといいなーなんて思いました。

 

■chromeから実行
  試しにhttp://mydns999999:Password0001@ipv4.mydns.jp/login.html
  にアクセスすると、以下のようにしてアドレスの通知が成功するみたいだ。
 
   Login and IP address notify OK.
   login_status = 1.
   
   MASTERID :
     mydns999999
   REMOTE ADDRESS:
     xxx.xxxx.xxx.xxx
   ACCESS DAYTIME:
     2022/03/13 01:29:59 UTC
   SERVER ADDRESS:
     xxx.xxxx.xxx.xxx
 
  ちなみに、mydns999999がユーザIDでPassword0001がパスワードです。
 
■BASIC認証
  IDとパスワードはBASE64で入れてあげるので前もって変換してしまいます。
  例えば上記のIDとパスワードの場合
    IDとパスワードをコロン(:)で区切って文字列を連結すると。以下のようになる。
     mydns999999:Password001
    この文字列をBASE64にする。テキストからBASE64にするときはEncodeと言う。
    BASE64 Encodeとかでググってください。
    エンコード後
      bXlkbnM5OTk5OTk6UGFzc3dvcmQwMDENCiAgICAgICAgICAgIA==

  で、HTTPヘッダー以下のように追加してあげればBASIC認証はOKです。
     Authorization: Basic bXlkbnM5OTk5OTk6UGFzc3dvcmQwMDENCiAgICAgICAgICAgIA==

■プログラム

  あとは定期的にプログラムから上記URLを呼び出してあげるだけなんでポイントだけ書きますね。
  全体は

    https://drive.google.com/file/d/1DVllwfE7Y42UHPfJyET35vh7LPUTW5XK/view?usp=sharing
    
  host="ipv4.mydns.jp"
  port=80
  auth="bXlkbnM5OTk5OTk6UGFzc3dvcmQwMDENCiAgICAgICAgICAgIA=="
  
  addr = socket.getaddrinfo(host, port)[0][-1]
  
  s.connect(addr)
  
  s.send(bytes('GET /login.html HTTP/1.0¥r¥nHost: %s¥r¥nAuthorization: Basic %s¥r¥n¥r¥n' % (host, auth_str), 'utf8'))
  
  data = s.recv(1000)
  
  s.connect(addr)

 


JUGEMテーマ:電子工作

 

ひょんなことからJSONファイルを扱うことになりまして。

メモっておきます。

 

import ujson

  #
  #config.jsonを読み出してパラーメーターで返す
  #
  def config_read():
    l_wifi_ssid = ""
    l_wifi_password = ""
    try:
      f = open(SETTEI_FILE_NAME, "r")
      jdata = ujson.load(f)
      l_wifi_ssid = jdata["wifi_ssid"]
      l_wifi_password = jdata["wifi_password"]
      f.close()
    except Exception as e:
        print("config file open error")
    
    return l_wifi_ssid, l_wifi_password

  #
  #config.json書き込み
  #
  # 
  def config_write(ssid, password):
    jdata = {}
    jdata["wifi_ssid"] = ssid
    jdata["wifi_password"] = password
    f = open(SETTEI_FILE_NAME, "w")
    f.write(ujson.dumps(jdata))
    f.close()
 

 


JUGEMテーマ:電子工作


ESP32カメラ
 
ラズパイカメラがなかなか安定しないので、
ここはやっぱり、ESP32カメラを投入してみた。
 
ラズパイカメラは

の記事で安定化策をいろいろしていて、
ほぼ安定!!ってなりましたとさ。
だけど、やっぱ時々調子悪い時もありつつ、
という結構使えるんだけど信頼性いまいちみたいな状況でしたが、
今回、前に実験していたESP32カメラを投入してみたいと思います。
 
前の記事でインストールについてはほかの記事参考ってしていましたが、
一通り書いてみたんでよろしくです。
全部を書くと大変なんで・・・注意点だけで。
 
■ESP32環境のインストール
 
 arduino環境にESP32の開発環境を乗っけます。
 
 arduinoIDEの環境設定から
 追加のボードマネージャーに追加してOK
   https://dl.espressif.com/dl/package_esp32_index.json
 
 ボードマネージャーの検索にESPを入力
 espressif Systemsの最新バージョン1.06をインストール。
 
 ツールから対象のボードにAI Thinker ESP32-CAMを選択しておく
 
■ソースの選択と変更
 
  スケッチ例→ESP32→Camera→CameraWebServer
  
  // Select camera model
①→//#define CAMERA_MODEL_WROVER_KIT // Has PSRAM
  //#define CAMERA_MODEL_ESP_EYE // Has PSRAM
  //#define CAMERA_MODEL_M5STACK_PSRAM // Has PSRAM
  //#define CAMERA_MODEL_M5STACK_V2_PSRAM // M5Camera version B Has PSRAM
  //#define CAMERA_MODEL_M5STACK_WIDE // Has PSRAM
  //#define CAMERA_MODEL_M5STACK_ESP32CAM // No PSRAM
②→#define CAMERA_MODEL_AI_THINKER // Has PSRAM
  //#define CAMERA_MODEL_TTGO_T_JOURNAL // No PSRAM
  #include "camera_pins.h"
③→const char* ssid = "wifi-ssid";
③→const char* password = "ssid-pass";
 
  ①WROVER_KITをコメントにする
  ②AI_THINKERのコメントを外す
  ③自宅のWIFIに合わせてSSIDとパスワードを変更
  
■PCと接続
 
  接続はいつものUSBからUARTに変換するモジュールで
  以下のように接続
  
 接続
  UART ---- ESP32CAM
  TXD      UOR
  RXD      UOT
  5V       5V
  GND      GND
  GND      IO0
  
  
■コンパイルと転送
 
  プログラムを転送する場合は上記配線のIO0をGNDに接続しておくこと。
  
  普通にarduino-IDEでコンパイル&転送すればうまく良くっす。
  なんかできないときは転送のタイミングの前でリセットボタンを
  押してあげてください。おそらくはうまく行くことでしょう。
 
■実行!!
 
 実行するときはIO0を接続しないでください。
 
■こんなん出来ました。
 


JUGEMテーマ:電子工作


カメラの複数ストロボシステム化
 
先日、ガラクタ屋、もとい
ハードオフにいった所、canonのストロボが300円で
同じのが2個あったので買ってみた。型番は300EZ
 

 
昔のストロボらしくて手持ちのeos kiss x4に取り付けてみたけど
対応していませんとカメラに言われるものの、
そのままAUTOモードでシャッターを切ると光ってくれて、
取れた写真を見るとまっしろ白のしか撮れませんでした・・・orz
 
 
色々調べると、ストロボとカメラの間で光具合を
調整する仕掛けが現代のカメラでは常識みたいです。
(調光補正とかE-TTLⅡとかの設定項目があるらしい)
eos kissの説明書によると270EX、430EXⅡとかだと、対応しているんだけど
古いやつの場合の説明が
「EZ/E/EG/ML/TLスピードライトを
 TTLまたはA-TTL自動調光モードに設定して撮影すると、常時フル発行します」
と書いてある
一方カメラのほうはA-TTLしか選べないみたいで
結局フル発光します。
となっているので、フル発光のまま使うんですが、その場合はカメラ側の絞りやシャッター速度調整で
なんとかするってことになっているみたいです。
 
そんでですね。
普通にカメラの上にくっつけると、内臓のストロボが出せなくなって
しまうみたいでして。
 
それから、
買ってきた300EZを2灯と内臓の1灯の合計3灯を
同時に光らせてやりたいと思いまして・・・
試行錯誤した記事です。
 
はい、カメラのストロボつけるところ。
ここにストロボつけます。
 

 
まんなかの大きめの丸い端子と
外側の四角いレール部分の金具がカメラの内部で接触することで
ストロボのスイッチになっているという簡単な仕掛けです。
ここにストロボ付けないと内臓ストロボが使えて、
付けると内臓ストロボが使えなくなる。
これって、じつは、ここにスイッチがくっついているみたいでして。
 

そのスイッチが入らないように細工すればOKってことで。
じゃーん
 

基盤をちょうどいい大きさに切り取って
片側に食い込みをちょうどよく入れてみました。
ということで、
https://youtu.be/g2vCInuzooc

こんな感じで両方光るようになるみたいです。
接続コネクタ完成。
 

3.5ミリのモノラルのオーディオジャックで接続する方式にして、
理論的には何台でもくっ付けられるようにしました。
 

 
 


 


USB接続クリスマスイルミネーション 秋月 USB接続デジタル入出力モジュール USB-IO2.0(AKI)M-05131
JUGEMテーマ:電子工作
 
「積読」=「つんどく」=書物を買って、積んでおくだけで、読まないこと。
もうね、つん読=積読と同じ感じで、買うだけでしまっておいたシリーズ
 
秋月でもう10年前ぐらいに買っておいたけどそのまま
閉まっておかれちゃった「PCとUSBの接続キット」
 

 
 
USBの先にTTLレベルの接点が接続されて、
C言語とかから(使いようによっては)
家電のON/OFF制御が出来るかもしれない
とかという。夢のような装置が、ありましたとさ。
もうね、10年前ならスマートプラグとかまだ無かったので、
かなり有効な装置。
そうはいえども、今も現役と考えますので・・・
で、今調べたら、まだ現役で売っておりますので
こちら使ってみたいと思います。
 
キットを開けると
名刺サイズのCD-ROMがくっついてきますけど。
丸くないので、周りをニッパーで切り取ってしまいました。
 

 
キザギザでもPCで読み取ってくれたので
感謝です。
今は、丸いのがついてくるので新しく買う人は安心ですね。
後で調べたら、名刺型CD-Rというものでした。
 

 
そういえば、すごい昔聞いたことがあるような無いような。
今は、CDはほぼダウンロードで置き換えられましたもんね。
こういう珍しいので名刺作ってみるもの良いんでしょうかね?
みたいな。やつです。
 
 
秋月のモジュールをPCとUSBで接続して
ついてきたCDに入っているプログラムをそのまま実行すると
動作確認できます。
 
J1とJ2のTTLレベル端子があるので、
これにLEDをつないだり、LOWにジャンパーして、
簡単に思う通りに制御ができるようになります。
 

 
接続押して送受信押して、
入出力状態のJ2が入力端子。
 プルアップされているので0Vに繋げば、そこが灰色になります。
入出力状態のJ1が出力端子。
 ビットごとに個別にON/OFFの制御ができます。
写真はJ2の1番だけを0Vにして他は何も繋いでいない状態
J1のほうは0番、2番、4番、6番が5Vで出力です。
そんな感じで。終わり。
  ・
  ・
  ・
  ・
  ・
  ・
ではつまらないので、
上記プログラムをベースにしてコマンドラインからできる、クリスマスイルミネーションを作ってみました。
動画
https://youtu.be/oSrUSmU_0rQ

 
プログラム
 
https://drive.google.com/file/d/1wyusqkA6ibc_6Bz-37Zx_8uCZ5Mh6lwW/view?usp=sharing
 
Option Explicit On
Imports System
Imports System.Runtime.InteropServices
・・・省略・・・
    Sub Main(args As String())
        Console.WriteLine("""
秋月 USB接続デジタル入出力モジュール USB-IO2.0(AKI)
'M-05131
'
'Windows標準のHIDドライバで動作する
'
'出力はJ1がデフォルト 8bit
' 出力は光らせたいところを1にして書き込めばOK
'
'入力はJ2がデフォルト 4bit
' J2端子はプルアップされているのでデフォルト0xF=15=1111が取得される
' 1bitずつLowにすると以下の数値が取得される
'  b0111=7
'  b1011=11
'  b1101=13
'  b1110=14
""")
        If openDevice() = True Then 'デバイスをオープンして
            IO_initial()            '初期化
            '
            'ここでは試しに1ビットずつランダムで光らせてみる
            '
            Dim r As New System.Random(1000)
            For k = 0 To 1000
                Console.Write("input = ")  '
                Dim n As Integer = 1
                Dim h As Integer = 1
                'n = Int(r.Next(100)) Mod 8
                If Int(r.Next(100)) < 50 Then
                    h = 1
                    n = 0
                Else
                    h = -1
                    n = 7
                End If
                For l = 0 To 7
                    Dim w As Integer = 1
                    Dim j As Integer = 1
                    w = r.Next(10) * 50
                    If n = 0 Then
                        j = 128
                    ElseIf n = 1 Then
                        j = 64
                    ElseIf n = 2 Then
                        j = 32
                    ElseIf n = 3 Then
                        j = 16
                    ElseIf n = 4 Then
                        j = 8
                    ElseIf n = 5 Then
                        j = 4
                    ElseIf n = 6 Then
                        j = 2
                    Else
                        j = 1
                    End If
                    IO(j, 0)    'J1への出力設定
                    Console.Write(" " & byteInJ2)  'IO関数からの戻り値 byteInJ2を表示
                    n = (n + h) Mod 8
                    System.Threading.Thread.Sleep(w)
                Next
                Console.WriteLine(" ")
            Next
            '
        Else
            Console.Write("デバイスが見つかりません。")
        End If
    End Sub
・・・省略・・・
 
IOにJ1への出力ビットをByteの属性で渡します。
IOではJ2の状態を取得してグローバル変数のbyteInJ2に戻してきます。
 
 

RaspberryPI-picoの使い方

 

遅ればせながらパイピコ手に入れて初めて使ってみましたのでその時のまとめ記事です。
ちなみに、パイソンでの使用方法です。

 

主として以下のページを参考にさせてもらっております。
https://elchika.com/article/d5c0dd9a-8b8a-4bf5-bca0-2181b0158a6d/#h_%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E6%9B%B8%E3%81%8D%E8%BE%BC%E3%81%BF

 

■パソコンのセットアップ

 

 pythonが必要っぽいです。
 自分のには入っているのでこれはパス。
 
 で、あと、
 
 PythonIDEとしてThonnyがあれば、後はいろいろ出来るようになります。
  https://thonny.org/
   ダウンロードが右上にあったんですが、
    最初見つけられなくていろいろ探しましたよ。


■パイピコのセットアップ

 

 BOOTSELを押したまま、USBでパソコンに接続。
 ドライブとして認識されるので中身を見ると
 INDEX.HTMとINFO_UF2.txtというファイルがあるので
 INDEX.HTMを開いて
 UF2ファイルをダウンロード
  Microcontrollers→MicroPython→Download the MicroPython UF2 file.
  rp2-pico-20210902-v1.17.uf2が取得できた。
 ダウンロードしたファイルをパイピコのドライブにドロップすると
 自動的に再起動する。
 これで、パイソンが使えるようになっている。

 

■Thonnyを起動。


 右下のところをMicropython(Raspberry Pi Pico)を選択

 

 

■プログラムを書いて右三角で実行

 

 実行するときに保存先をThisConputerとRaspberryPiPicoのどちらか聞いてくるので
 ThisComputerを選択でパソコンに保存
 RaspberryPiPicoを選択すると、pikoに保存。

 

 

■電源起動時に自動的にプログラムを走らせたい場合は


 ファイル名をmain.pyとして上の方法でpikoに保存すれば、そのプログラムが実行される


■プログラム参考

 

□ls.py

 

import uos
for f in uos.ilistdir("/"):
 print('{:12} {}{}'.format(f[3]if len(f)>3 else 0,f[0],'/'if f[1]&0x4000 else ''))

 

□cat


with open('main.py') as f:
 while 1:
  b=f.read(512)
  if not b:
   break
  print(b,end='')

 

□write


string = '''from machine import Pin
import utime

led = Pin(25, Pin.OUT)

while True:
    led.value(1)
    utime.sleep(1)
    led.value(0)
    utime.sleep(1)
'''

f = open('./main.py', 'w')
f.write(string)
f.close()


□rm


import uos
uos.remove('main')


□L-Tika


from machine import Pin
import time

Version = "0.01"
print("L-Tika Build "+Version)

while True:
 led = Pin(25, Pin.OUT)
 led.value(1)
 time.sleep(1)
 led.value(0)
 time.sleep(1)

 

□マシンの固有ID表示


 import machine
 machine.unique_id()
 ※ESPの場合はこれでOKだけど、パイピコは1台しかないのでたぶん。

 

■リセット。

 

 ピコのrunの端子をグランドに接触させるとリセットされます。

非接触で電気を送るコイルユニットWT202080-28F2-Gと受けるWR151580-48F2-G
 
前の記事でラジコン的なやつを作りましたけど。

これって、不在の住居を監視するために
カメラを搭載して活用したいんだよね。
 
つまり、カメラのっけて家の中走り回らせたいわけ。
簡単にできもの買ってきてというのでは趣旨に反するので
自分で作ってみますね。的な発想から。
自分で充電できないとだめだよね。ひと月ぐらいはお部屋の監視させたいしね。
みたいな。
 
普通にwebカメラがあれば、大体のお部屋の様子はつかめるので、
首を振るようにしてみました。
が、
こちら

で。
 
リモデが繋がらなくなるのはパソコンのせいなので、
強制的に電源ONとOFFが出来るようにしてみたのが

なんですが、
今度はお部屋を走らせたいと考えたら
いろいろと、考えることができてきて。
というか、誰も充電してくれないところで、
コンセントのところに行って充電するという
超難しいところにぶつかりました。
 
いつもの秋月にありました、
非接触で電気を送るコイルユニットWT202080-28F2-Gと受けるWR151580-48F2-G
これの基礎実験的な記事です。
 
前置きがなくなりましたが
いつもの調子でいきます。
 
■回路
秋月で見つけた非接触で電力を送れそうなやつが100Khzで発振させるお決まりなようだったの
ですが、100KHzで発振させると秋月の8407モジュールのスピードが間に合わないっぽい。
 (⇒効率を上げるためにオシロを手に入れて色々調べたら、波形が無茶苦茶なにが判りまして。
  このFETにスピードが間に合っていないことが判明!!
  スペック調べたら、必要な速度の半分ぐらいの性能みたいでした。
  ここは発振周波数を落とすか、高速のFETを使うかだったんですが手持ちのFETが無いので
  発振用のコンデンサーを0.01μFにして対応。2021/11/22)
555を使って10KHzに近い周波数で発振させています。
 

 
それをFETを4個搭載している8407で増幅します。
マイナスを作るために7404は反転するために使っています。
 
 

 
■実験結果
 
そんなんで、やっておりましたが、
USBの5Vではモーターを回せなかったので、
別電源から8407に電力6Vぐらいを供給しました。
で、モーターを一個回せる電力が届いています。
たぶん、100ミリワットぐらい。
これって、供給電力に対してはおそらく五分の一ぐらいですね。
でも、今の環境だとオシロもないし。
 テスターに期待していたけど、周波数計れないし。
  ないないずくしでした。
  
でも、モーター回っているので、最低でも100mA、良ければ200mVは供給できているはず。
信じて次行きます。
補足・・・いちおう、電力増強して12Vまで上げてみたけど。
8407のFETのあたりから煙が上がり、とっても熱ーくなっていたので、
今回はここまでです。
■実験映像
 
https://youtu.be/HSi0uDEsawc
 

 
■2021//11/22対応の発振周波数を10KHzに落として
 8407に別電源から電力を供給することで 5Vの2AのUSB電源で1.7A供給の状態で
 モーター一個分は軽く回せるまで効率アップしましたので、
 おそらく、非接触でのUSBバッテリーへの充電ぐらいはできるのでは?
 と張り切っております。