マカロニペンギンの健忘録

特にテーマを決めているわけじゃないが、私が気になったことを書いていく予定です。

"Debian 12 Bookworm"を使用していてWiFi環境を変更したときにつながらなかった人のため

2024年02月17日 | プログラミング
[Japanese]
Debianを自宅でインストールして、当然WiFi環境も自宅の設定にして問題なく使用できていたのに、いざ外に持ち出した途端にネットワークマネージャーであるconnmanもWiFi Scanしても、外出先のWiFiを捕まえることはできないし、困惑してしまうことがありました。「自宅ではあんなに上手く繋がっていたいたのに・・・」
そのためにネット環境が繋がっている間に必ずrfkillをインストールしておきましょう。
出先でconnmanUIでWiFi Scanしても全くWiFiが表示しなかった場合
rfkill unblock all
のコマンドを入れ、リブートしてください。
するとWirelessタグでRescanでネットワークが表示されますのでWiFiの設定をしましょう。
ネットワークは繋がりますが、ホームページなどは表示することができません。
自宅でのネット設定が残っていて邪魔しています。
sudo nano /etc/resolv.conf
でeditorでファイルを開いて

nameserver 8.8.8.8
nameserver 8.8.4.4

を追加します。

[English]
Title:For those who are using "Debian 12 Bookworm" and cannot connect when changing the WiFi environment
Translate:I installed Debian at home and was able to use it without any problems with the WiFi environment set at home, but as soon as I took it outside, even though the network manager connman and WiFi Scan did not work, I couldn't catch it, and sometimes I was confused. "Even though we were so well connected at home..."
Therefore, be sure to install rfkill while the internet environment is connected.
If you scan WiFi with connmanUI on the go, but no WiFi is displayed

Please enter the command.
 rfkill unblock all
 sudo systemctl reboot

Then Rescan with Wireless tag will display the network, so let's set up the WiFi.
The network is connected, but the homepage etc. cannot be displayed.
My internet settings from home remain and are causing trouble.

Open the file in editor with
 sudo nano /etc/resolv.conf

Add.
 nameserver 8.8.8.8
 nameserver 8.8.4.4

[References]


MicrosoftのCopilotを使ってみた

2024年01月12日 | プログラミング
複合プリンター更新に伴い、FAXの受信はpdfでハードディスクに格納することになった。しかし、受信したときに「ピー」と音はするが、聞きそびれてしまうと受信したことに気が付かないと事態になってします。
そこで受信したことをパソコンに教えてもらうということにした。

しかし、WindowsのAPIにそのような機能があるということまではネットを検索すればわかるのだが、自分でプログラムを組むにはハードルが高い。そこでMicrosoftのCopilotに聞いてみた。

質問した内容は以下の通り
「開発言語python windows api findfirstchangenotificationでフォルダー監視ソフトを作成」

それで以下のプログラムを出力してきた。
import win32file
import win32con

path_to_watch = "C:\\Users\\user\\Documents\\test_folder"
hDir = win32file.CreateFile(
    path_to_watch,
    win32con.GENERIC_READ,
    win32con.FILE_SHARE_READ | win32con.FILE_SHARE_WRITE | win32con.FILE_SHARE_DELETE,
    None,
    win32con.OPEN_EXISTING,
    win32con.FILE_FLAG_BACKUP_SEMANTICS,
    None
)
while True:
    results = win32file.ReadDirectoryChangesW(
        hDir,
        1024,
        True,
        win32con.FILE_NOTIFY_CHANGE_FILE_NAME |
        win32con.FILE_NOTIFY_CHANGE_DIR_NAME |
        win32con.FILE_NOTIFY_CHANGE_ATTRIBUTES |
        win32con.FILE_NOTIFY_CHANGE_SIZE |
        win32con.FILE_NOTIFY_CHANGE_LAST_WRITE |
        win32con.FILE_NOTIFY_CHANGE_SECURITY,
        None,
        None
    )
    for action, file_name in results:
        full_filename = path_to_watch + "\\" + file_name
        print(full_filename, action)
です。 (¥ = 逆スラッシュ)

実際にはfindfirstchangenotificationではなくReadDirectoryChangesWで出力したきたのですが、path_to_watchのパス名を修正するだけで実行できてしまいました。
 
いやいや、すごい時代になったものだ。

AliexpressのRelay Board-4 V1.2を使ってみた

2023年07月24日 | プログラミング
 以前からModbus over rs485通信を使ってみたかった。しかし、この通信方法を使った製品で日本製はどれも高すぎるのでプライベートで使う値段ではない。
そこでAliExpressだ。賛否両論なのは当然知っているが、とりあえずプライベートで電子工作をしている人にとってはなによりの味方である。

 使用しているのはAliExpress内の「モジュールrs485 ttl通信4チャンネル入力リレーモジュール12v/24v modbus rtu 4チャンネルリレーモジュール」です。現在は取り扱いは終了しているようですが、AliExpressの中の他のブースでも似たようなボードを販売されているようなので、同じようなものを選んでも使用できるのではないかと思います。

 とにかく販売しているホームページ上で資料が少なすぎる。中国の方はこれを見ただけでスラスラって使えてしまうのだろうか。私はスラスラとは行かなかったので、ここにチュートリアルというか、すべてを知り尽くしているわけではない私が知り得た限りをここに記載しようということです。

私の開発環境は
  OS = Debian (Desktop = LXQt)
  Programming Language = Python
  Install Library = PySerial
  PC Side USB-RS485 Conversion adapter = UsbにRS485 485変換アダプタ

Example-1

# blog:https://blog.goo.ne.jp/soratobu_macaronipenguin 
# FaceBook:https://www.facebook.com/akihiro.sugawara1
import serial
import time
send_data = [None] * 2 
send_data[0] = "01 05 00 01 01 00 9d 9a" #Relay No.1 ON 
send_data[1] = "01 05 00 01 00 00 9c 0a" #Relay No.1 OFF 
relay_status = True 
#c_port = 'COM3' # Windows 
#c_port = '/dev/ttyCH341USB0' 
c_port = '/dev/ttyUSB0' #Debian 
def plus(i): 
    return(int(i,16)) 
def send_process(i): 
    #送信データを作成 
    l_d1 = list(map(plus,send_data[i].split())) 
    send_binary = bytes(l_d1) 
    # pyserialで送信 
    with serial.Serial(port=c_port,baudrate=9600,bytesize=8,parity='N',stopbits=1,timeout=0.2) as ser: 
        res = ser.write(send_binary) 
        b_reply = ser.read(8) 
        # print(b_reply) 
#メイン 
while True: 
    send_process(relay_status) 
    # print(relay_status) 
    i = "0" 
    while i != "1": 
        i = input("1を入力してください") 
    relay_status = not(relay_status) 

参考文献は
  M-System Modbusプロトコル概説書
  Twins Chip Modbus RTU 4CH 12V RS485 module


MicroPythonの機能の見直しのまとめ

2023年04月22日 | プログラミング
esp8266を改めて使い始めました。
以前に気が付かなかったのか、新しくなったのかわかりませんが、いままで知らなかったので健忘録としてここに記載します。

ちなみに、私はubuntu系のPCを使っています。Windowsではないので少し使い方が違うかもしれません。
いままで知らなかった機能とはmicropythonにあるmpremoteコマンドです。
ここで、確認してください。

以前、「シリアルターミナルを使ってREPLしていたこと」と「ampyでやっていたファイル転送」をこのコマンドでできるようだ。

micropythonは素晴らしい技術だと思うが、これまで使いづらいと思うのがデバック時に作成したスクリプトをデバイスに転送する→REPLをつなぐ→実行する→PCで修正する→REPLを切る→転送するを繰り返す。pythonのインタープリタとしての手軽さが生きないなぁと思っていました。
しかし、mpremoteのmountを使ったらこれは行けるのではないかと考えを改めました。
このmountは一般的に言うマウントとは逆でデバイス側がPC側のディレクトリーをマウントしています。この状態でデバイス側からPCに格納してあるスプリクトを直接起動することができます。そして、マウントした状態でREPLすることができます。
mpremote u0 mount .

REPLでスプリクトを直接起動することができませんが、importしてdef関数を起動する必要があります。

【注意1】
importすると再読込ができないため、スプリクトを修正したらCTL + Dでマウントを再起動した上で再度importしてください。

【注意2】
def関数部分は起動することができますが、スクリプトのメイン部分を実行することができないため、

def main():
    メインのスクリプト
if __name__ == '__main__'
    main() 

という、フォーマットでスクリプトを作成してください。

REPL内で実行したいときは
   import ファイル名
   ファイル名.main()
です。
ESP8266で自動起動で実行したいときは
ファイル名をmain.pyに変更して、必ずesp8266に転送してください。


Pythonerの憂い その1

2023年03月20日 | プログラミング
いきなりですが「Atcoderやってますかぁ~」(アントニオ猪木風)

昨日、ABC294(AtCoder Beginner Contest 294)にチャレンジしたのですが、4問目の内容は理解できて、プログラムまで大体作成できた(実際には少々読み間違えがあったのも事実)のですが、タイムオーバー(TLE)になってしまい、最後までたどり着くことができませんでした。
私が使っているプログラム言語はPythonです。
C++のクラスを勉強した時に挫折した私としては救世主に近い。生まれ変わってもPythonに出会いたいと思っているほどだ。しかし、実行速度が遅い。Pythonのせいにしたくはないが、今回のTLEはPythonの実行速度が関係しているのではないかと思っている。
恥ずかしながら、私が作成したプログラムを公開する
n , q = map(int,input().split())
call  = 1
uke = set()
e1 = e2 = 0
for i in range(q):
    e = input()
    if e[0] == "1":
        uke.add(call)
        call += 1
    if e[0] == "2":
        e1 , e2 = map(int,e.split())
        uke.remove(e2)
    if e[0] == "3":
        print(min(uke))
(このプログラムはこのリンクを辿っても見ることができる)

まず、このプログラムは正しいと仮定しよう。
読み込みデータは25コ、Pythonで実行した時は7つにTLEがでて、PyPy3で実行した時は2つにTLEが出てしまいました。

きっと、もうひとひねり、ふたひねりが必要なのでしょうが、オレには見当たらない😢 
もう少し、がんばってみます。 ただの愚痴でした。

灰色の戯言(AtCoder Beginner Contest 212 C - Min Difference)

2023年01月13日 | プログラミング
私はAtCoderの灰色です。現在、茶色を目指して健闘中です。

 
ただ、私の理解度が低すぎて今回練習で解いたABC212のC問題の解説をいくら読んでも理解できませんでした。しかし、奮闘の結果自力でなんとか解くことができました。
あくまでも今後のために記録として残しておきたいと思ったので、自分で解説を書くことにしました。
開発言語はPythonです。
n , m = map(int,input().split())
a = list(map(int,input().split()))
b = list(map(int,input().split()))
c_min = 10**9
for i in range(n):
    for j in range(m):
        c_min = min(c_min,abs(a[i]-b[j]))
print(c_min)

上記の全検索だとタイムオーバー(TLE)になってしまいます。

そこで

Aリスト、Bリスト共にソートしたものを、i及びjの小さい順にAとBを比較、AまたはBの小さい側は一つ右にシフトして、再びAとBを比較します。それを繰り返します。
①A1とB1を比較、Aが小さい
②Aが右に移動(i += 1)
③A2とB1を比較、Bが小さい
④Bが右に移動(j += 1)
⑤A2とB2を比較、Aが小さい
⑥Aが右に移動(i += 1)
⑦A3とB2を比較
その間にAi-Bjの値を比較して、最も差が小さい数字を出力します。

n , m  = map(int,input().split())
a = list(map(int,input().split()))
b = list(map(int,input().split()))
a.sort()
b.sort()
c = 10**9
i = j = 0
 
while i < n and j < m:
    c = min(c,abs(a[i]-b[j]))
    if a[i] < b[j]:
        i += 1
    else:
        j += 1
print(c)

ボケ防止にAtCoderを始めました。

2022年09月13日 | プログラミング
 以前からプログラミングをしたいと思っていたが、プログラムを組む機会がなかったので技術書を購入して読んでもなかなか身につかなくて困っていた。
 ここでAtCoderと出会った。
 簡単な問題・ちょっとムズイ・かなりムズイ・私には解けない、まで段階的な問題が並んでいる。
 さらに先日、そのAtCoderのコンテストがあったのですが、いやぁ難しい難しい。積分など30年以上前に高校の校舎に置いてきてしまったものですから、今となってはなにをするためのツールかわかなくなっています。改めて勉強しなおさないと先に進めそうにもないので頑張るかなぁ。

このヘタレなおじさんが解き終わった記録をここに載せておきます。
2022年9月13日現在の記録です。 



問題名
点数
結果

ABC268
A-
100
AC
20220910

B
200
AC
20220910


C-Chinese Restrant
300
TLE
タイムアウト挫折20220911
ABC267
A-Saturday
100
AC
20220903


B
200
挫折


ABC266
A-Middle Letter
100
AC



B-Modulo Number
200
AC



C-Convex Quadrilateal
300
WA
ベクトルが理解できない

ABC088
A-
100
AC


B-Card Game for Two
200
AC



C-Takahashi's Information
300
AC
ほとんど1日かけて回答した20220905
ループなしで回答する方法20220908


D

挫折
BFSについて勉強中

ABC087
A
100
AC
20220908

B-Coins
200
AC
20220908


C
300
AC
20220908
ABC086
A-Product
100
AC
20220909


B
200
AC
20220909

C-Traveling
300
AC
20220909

ABC085
A
100
AC
20220911

B-Kagomi Mochi
200
AC
20220911

C-Otoshidama
300
AC
20220912 枚数をループさせた

ABC083
A
100
AC
20220912

B-Some Sums
200
AC
20220912
ABC081
A-Placing Marbles
100
AC
20220912

B-Shift Only
200
AC
20220912


C
300
AC
20220913 問題の趣旨勘違い苦戦

ABC049
A
100
AC
20220913


B
200
AC
20220913

C-Daydream
300
AC
20220913


MicroPythonでI2CインターフェースのLCDに表示する 第3弾

2022年04月23日 | 電子工作

今回はカタカナ文字に対応しました。
入力はあくまでも半角のカタカナでお願いします。

書き込むスクリプト名をacm.pyとした場合

import acm
acm.clear()
acm.send_text('キョウハイイテンキ')

とすれば表示します。

さらにこのlcdには「千」とか「万」とか「円」とか表示できるのですが、これは

acm.cmd(0x80,0xfa)   → 千
acm.cmd(0x80,0xfb) → 万
acm.cmd(0x80,0xfc) → 円

で、直接コードを叩いてください。

最後に一ついいわけなのですが、本当はencodeする際にshift-jisを指定すればよいのですが、本家のPythonはうまくエンコードできたのですが、MicroPythonのほうが対応していなくてうまく動作しませんでした。 MicroPythonのフォーラムに書き込みましたが、対応してくれるかどうか・・・・ 
なんとかカタカナが表示できたので、やっと次のステップに進めそうです。

#This python program is a fork of Choco-Tips.com
#Fixed by MacaroniPeinguin
#Version 2022.04.15 Choco-Tips.comバージョンをESP32に対応 ブログバージョン
#Version 2022.04.20 様々なプラットフォームに対応
#Version 2022.04.23 カタカナ表示に対応

import sys
from time import sleep
from machine import Pin
LCD_ADDR = 0x50
platform_name = sys.platform
if 'esp8266' == platform_name:
    from machine import I2C
    i2c = I2C(scl = Pin(5),sda = Pin(4),freq = 100000)
elif 'esp32' == platform_name:
    from machine import SoftI2C
    i2c = SoftI2C(scl = Pin(22),sda = Pin(21),freq = 100000)
else:
    from machine import I2C
    i2c = I2C(scl = Pin(5),sda = Pin(4),freq = 100000)

def cmd(a, b, msec = 0):
    buff = bytearray(2)
    buff[0] = a
    buff[1] = b
    i2c.writeto(LCD_ADDR, buff)
    if msec > 0:
        sleep(msec / 1000)

def send_text(text):
    for ch in text:
        list_t = []
        list_t1 = []
        list_t = ch.encode("utf-8")
        for i in list_t:
#            print ("i",hex(i))
            if i < 0x80 or 0x9f < i:
                list_t1.append(i)
            else:
                list_t1.append(i+0x40)
        cmd(0x80,list_t1[-1])

def clear():
    cmd(0x00, 0x01, 20)
    cmd(0x00, 0x38, 10)
    cmd(0x00, 0x0c, 10)
    cmd(0x00, 0x06, 10)

def move_cur(col, row = 0):
    if row > 0:
        col = col + 0x40
    col = 0x80 | col
    cmd(0x00, col, 20)

def print_test():
    clear()
    move_cur(0, 0)
    send_text("タズネツヅケナサイ")
    move_cur(0, 1)
    send_text("モトメツヅケナサイ")

if __name__ == '__main__':
    print_test()


MicroPythonでI2CインターフェースのLCDに表示する on ESP32 第2弾

2022年04月21日 | ドローン

今回はESP32 と ESP8266に同じスクリプトで対応できるようにしました。
私がこの2台以外にMicroPythonを駆動することができるマイコンボードを所有していないのでこれだけです。

それとまだまだ改良の余地がありますが、カタカナを表示できるようにしました。
使い方としてはスクリプト名をacm.pyとした場合
import acm
acm.send_kana(0b10110001)
でカーソルのある場所に「ア」を表示するはずです。
カタカナ表示に関しては今後どのようなスクリプトにしたら良いのか検討中です。

今回公開のスクリプトは以下のものです
#This python program is a fork of Choco-Tips.com
#Fixed by MacaroniPeinguin
#Version 2022.04.15 Choco-Tips.comバージョンをESP32に対応 ブログバージョン
#Version 2022.04.20 様々なプラットフォームに対応


import sys
from time import sleep
from machine import Pin
LCD_ADDR = 0x50
platform_name = sys.platform
if 'esp8266' == platform_name:
    from machine import I2C
    i2c = I2C(scl = Pin(5),sda = Pin(4),freq = 100000)
elif 'esp32' == platform_name:
    from machine import SoftI2C
    i2c = SoftI2C(scl = Pin(22),sda = Pin(21),freq = 100000)
else:
    from machine import I2C
    i2c = I2C(scl = Pin(5),sda = Pin(4),freq = 100000)

def cmd(a, b, msec = 0):
    buff = bytearray(2)
    buff[0] = a
    buff[1] = b
    i2c.writeto(LCD_ADDR, buff)
    if msec > 0:
        sleep(msec / 1000)

def send_text(text):
    bin = text.encode("utf-8")
    for ch in bin:
        cmd(0x80, ch)
#    print(bin)

def send_kana(text_bin):
    cmd(0x80,text_bin)

def clear():
    cmd(0x00, 0x01, 20)
    cmd(0x00, 0x38, 10)
    cmd(0x00, 0x0c, 10)
    cmd(0x00, 0x06, 10)

def move_cur(col, row = 0):
    if row > 0:
        col = col + 0x40
    col = 0x80 | col
    cmd(0x00, col, 20)

def print_test():
    clear()
    move_cur(0, 0)
    send_text("Keep on asking, ")
    move_cur(0, 1)
    send_text("Keep on seeking.")

if __name__ == '__main__':
    print_test()

MicroPythonでI2CインターフェースのLCDに表示する on ESP32

2022年04月15日 | 電子工作
久しぶりにマイコンボードに触りたくなって、MicroPythonを書き込んだESP32でI2CインターフェースのLCDに表示することにしました。

以下の内容は記載しません。MicroPythonのオフィシャルなどのホームページを参考にしてください。
ESP32にMicroPythonのファームウェアを書き込む方法
ESP32にPythonのスクリプトを書き込み方法
対話型ウィンドウ=REPLの操作方法

MicroPythonでI2CインターフェースのLCDにアクセスしている記事は多々ありましたが、参考にしたのはhttps://choco-tips.comの「ラズベリーパイ I2Cキャラクターモジュールを使う」です。Raspberry PiでI2CインターフェースのLCDのアクセスしている記事でした。 importしているライブラリー名などを多少変更するだけで使用することができました。
あと、私が持っているESP32がI2Cと相性が悪いのかわからないですが、ハードウェアI2Cだとうまく動作せず、ソフトウェアI2Cを使用しています。
#This python program is a fork of Choco-Tips.com
#Fixed by MacaroniPeinguin

from time import sleep
from machine import Pin,SoftI2C
i2c = SoftI2C(scl = Pin(21),sda = Pin(22),freq = 100000)
LCD_ADDR = 0x50
buff = bytearray(2)

def cmd(a, b, msec = 0):
    buff[0] = a
    buff[1] = b
    i2c.writeto(LCD_ADDR, buff)
    if msec > 0:
        sleep(msec / 1000)

def send_text(text):
    bin = text.encode("utf-8")
    for ch in bin:
        cmd(0x80, ch)

def clear():
    cmd(0x00, 0x01, 20)
    cmd(0x00, 0x38, 10)
    cmd(0x00, 0x0c, 10)
    cmd(0x00, 0x06, 10)

def move_cur(col, row = 0):
    if row > 0:
        col = col + 0x40
    col = 0x80 | col
    cmd(0x00, col, 20)

def print_test():
    clear()
    move_cur(0, 0)
    send_text("Keep on asking, ")
    move_cur(0, 1)
    send_text("Keep on seeking.")

if __name__ == '__main__':
    print_test()