投稿

ラベル(プログラミング)が付いた投稿を表示しています

今日のラズパイ日記 : 1日ほど連続稼働させているとWiFi接続出来なくなってしまうことが何度か発生

WiFi接続出来なくなってる? Raspberry Piを定点観測カメラとして設置、撮影ファイルをクラウドにアップロードするということをやっています。始めのうちはちゃんとシステムは動いているんですが、1日ほど稼働していると突如撮影ファイルのアップロードが停止しているという状況に。 始めはCron、もしくはCronで回しているシェルスクリプトの書き方をミスったかと思ったんですが、どうもそうではない。 sshもpingも通らない それとその状態になると、パソコンからssh接続しようとしても失敗。pingも通らないという始末。 WiFiのパワーマネジメントが原因…かも? で、ネットでこのような状況について調べたところ、どうやらWiFiのパワーマネジメント設定が関係している模様。 $ sudo iwconfig wlan0 で見てみると、以下の出力があったのでたしかにパワーマネジメントはオンなっていました。 Power Management:on ただ本当にこの設定が原因かどうかは分からないですけどね。 とりあえずの対処 この設定をOFFにする方法もいくつかネット上のサイトに載っていたので、それで対処出来るか検証してみることにします。とりあえずの応急的な対処として、1日経過した辺りで1回Raspberry Piをシャットダウンするなり再起動するなりしていこうかなと。本格的にとりかかるのはまたまとまった時間が取れてからということにしときます。 スポンサーリンク Amazon商品リンク : Raspberry Pi関連商品

最近自作したタイムラプス撮影のシステム周りの話

初期の頃のシステム 数年前、USB接続のWebカメラとノートパソコンを用いてタイムラプス撮影をしてました。ただそれは2年くらい運用してたところ、Webカメラが動作しなくなってしまいシステムとしてはそのままお蔵入り。 最近自作したシステム、2種 Raspberry Pi 4とカメラモジュールを用いたもの 1つは最近買ったRaspberry Pi 4とカメラモジュールを用いたシステム。ただこれでシステムを構築するとRaspberry Piがタイムラプス撮影専用になってしまい、他の用途に使い難くなってしまうのでちょっと保留中。 Pi 4以外にPi Zeroを入手してタイムラプス撮影専用にしようかと模索中。 Sonyのアクションカムを用いたもの こちらが現在メインで稼働させているシステム。ひょんなことからSonyのアクションカムを入手出来たので、それを利用してタイムラプス撮影に使ってます。軽量かつ三脚に設置しやすいってのもいいですね。ただこれもタイムラプス撮影に使ってしまうと、他の用途に持ち出しにくくなってしまうという点はRaspberry Piと同じ。 それはそうと、撮影の方はアクションカムの方にインターバル撮影モードがあるので簡単にタイムラプス撮影が出来ています。生成した画像ファイルはFFmpegコマンドで動画ファイルにエンコードしています。 あとこのアクションカムはAPIを用いることで無線LAN接続したパソコンなどからも操作可能になっています。これにより撮影した画像ファイルを取りに行く手間がだいぶ省略出来てます。毎回三脚から取り外して持ってきたりすると、位置合わせの手間が出てきちゃいますからね。無線経由でファイル転送することで、そういったのを省くことが出来ます。 (スマートフォンのアプリからもファイル転送は可能です。ただファイル数が数千枚だったりエンコードの過程を考えるとパソコンだけで済ませられた方が楽かなと) APIの使い方はここでは特に触れませんが、手順としては アクションカムとパソコンを無線LAN接続 アクションカムをファイル転送モードに切り替え 個々のファイル入手用のURIのJSONファイルを取得 JSONファイルを解釈して、URIから個々のファイルを取得 (ここでのURIはカメラストレージ内部のファイルの格納場所を示す) と行った流れ。ファイルを取得出来たら...

今日のラズパイ日記 : Cronを利用してリモートカメラや温度通知システムを作ってみるなど

以前購入したRaspberry Pi 4ですが、なにやら公式から新しいOSが登場したり(Raspberry Pi OS)、メモリが8GBのモデルが出たりと新しい動きが出ている模様。そういえばハイスペックのカメラモジュールもいくつか出てましたね。 OSに関しては名称が変わった程度のようですが、実際のところはどうなんでしょね? さて、そんな中で自分は一体何をしていたかというと、リモートから自宅のラズパイを利用する方法をあれこれと考えていました。まぁサーバーとして公開するとかどこかのレンタルサーバーと連携させるとかいろいろ方法はありそうとは思うんですが、契約が必要なものはちょっとめんどい。実際はそうした方が自由度があるんですけどね。 ということで、出来るだけいまの環境だけで出来るものをと考えていたところ、Raspberry Piで取得したデータをメールで添付する方法に行き当たりました。ただこれはシンプルそうに見えるんですが、コマンドラインから操作するものを選んだり、プロバイダなどのメールサーバーとの通信を設定したりとこれはこれでめんどい。 (たぶんやれば出来るけど、やるのがめんどくさくてやらないいつものパターン) そんな中で比較的簡単そうだったのが、オンラインストレージのDropboxにRaspberry Piで取得したデータを保存していくという方法。DropboxのAPIを利用するDropbox-Uploaderというシェルスクリプトが公開されているのでこれを利用することにしました。 (素のDropboxをインストールするという方法はめんどうそうだったのでスルー) Dropbox-Uploaderはいくつか初期設定が必要となってきますが、なんとか完了。これでコマンドラインからDropboxをある程度操作出来るようになりました。 後は、raspistillやvcgencmdといったコマンドを利用して写真やSoCの温度データを取得。これをCronで一定時間毎に実行。合わせてDropboxにそのデータを保存していきます。 SoCの温度データに関しては別に室温を示しているわけでもないので、これ自体はそれほど意味があってやってるわけでもなく。将来的に何かしらの温度センサーなど使えるようになったらいいかなと。 raspistillでの画像取得は結構役に立ってますね。空の様子を撮影し...

Python turtle graphics 作例 : とある作図アルゴリズムにおいて変数変化による図の形状一覧

イメージ
動画 ソースコード import turtle, math, time window_x = 16 * 80 window_y = 9 * 80 turtle.setup(window_x, window_y, 0, 300) turtle.bgcolor("#000000") llx = 0 lly = 900 urx = 1600 ury = 0 turtle.setworldcoordinates(llx, lly, urx, ury) def star(x, y, angle, length):    turtle.pencolor("#FFFFFF")    turtle.penup()    turtle.goto(x, y)    turtle.pendown()    for i in range(0, 30):      turtle.fd(length)      turtle.right(angle)    turtle.setheading(0) # turtle.tracer(100,0) turtle.speed(5) x_dif = abs(llx - urx)/11 y_dif = abs(lly - ury)/10 h = 1 for m in range(9):    for n in range(10):      L = 70      star((x_dif * n) + (x_dif / 2), (y_dif * m) + (y_dif / 2), 180+h, L)      h = h + 1 turtle.mainloop() まとめページ Python turtle graphics まとめ スポンサーリンク Amazon商品リンク : Pythonプログラミング関連

Python turtle graphics : 指定座標への移動(goto, setposition, setx, sety)

イメージ
turtleの指定座標への移動 turtle graphicsではforwardやright、leftなどによる前進や回転でturtleを移動させる他に、座標を指定して直接その位置へturtleを移動させることも出来ます。 x、y座標を指定して移動する 以下のメソッドは引数としてx、y座標を指定すると、その位置へturtleが移動します。 turtle.goto() turtle.setposition() 省略形 : turtle.setpos() 例えば、x座標が250、y座標が80の位置に移動させる場合は turtle.goto(250, 80) とします。 座標を配列として指定 またこれらのメソッドはx、yの引数2つの他、例えば[30, 60]のような配列を引数とすることも可能です。 その場合は以下のようになります。 p = [100, 200] turtle.goto(p) x、yのどちらか一方の座標のみ指定して移動する 以下のメソッドではxもしくはy、一つの引数だけ指定して移動することが出来ます。 turtle.setx() turtle.sety() どちらか一方の座標は固定して移動したい場合には便利に使えるでしょう。 移動時に線を描くかどうか さて、以上のような座標を指定して移動するとき、線を描くかどうかを場合によって選択する必要が出てくるでしょう。 単にそのままメソッドを実行した場合は線が描かれます。しかしそうではなく、移動時には線を描かせないようにしたい場合もあるでしょう。そういった場合は以下のメソッドを組み合わせて用います。 線を描くペンを無効にする。 turtle.penup() 省略形 : turtle.pu() 省略形 : turtle.up() 無効にしたペンを再度有効にする。 turtle.pendown() 省略形 : turtle.pd() 省略形 : turtle.down() 実際にこれらのメソッドを用いる場合、まず移動前にペンを無効にしておいて、移動後に再びペンを有効にします。 実行例は以下のようになります。 turtle.penup() turtle.goto(30, 210) turtle.pendown() ...

Python turtle graphics : turtleの進行していく角度の設定(right, left, setheading)

イメージ
Turtleの進む角度の設定について Turtleの進む方向(方角)を指定するためのメソッドがいくつかあります。指定した角度だけ回転させるメソッドと、指定した任意の角度へ回転させるメソッドなど。 回転させるメソッドはそれだけでは単にturtleが回転するだけなので、任意の方向へ進ませる場合は前進などのメソッドと合わせて用いることになります。 ここではturtleを回転させる基本的なメソッドを紹介していきます。 右方向へ回転させる turtle.right() のメソッドによりturtleを右方向へ回転させることが出来ます。引数として回転させたい角度を与えます。 省略した書き方として turtle.rt() という書き方も出来ます。 なお回転させた後はその角度を向いたままになるため、再度このメソッドを実行するとさらにその角度だけ回転することになります。 例えば turtle.right(30) turtle.right(25) と実行すると、turtleは30+25で55度右向きに回転することになります。 左方向に回転させる turtle.right()とは逆に左方向に回転させるメソッドに turtle.left() があります。こちらも引数として回転させたい角度を与えて用います。 省略形は turtle.lt() となります。 なお、turtle.right()に負の角度の値を与えることでも左方向に回転させることが出来ます。 逆にturtle.left()も負の角度の値を与えれば右方向に回転させることが出来ます。 任意の角度へ回転させる turtle.right()、turtle.left()では引数に与えた角度だけ回転しますが、任意の角度へ直接回転させることは出来ません。 引数に任意の角度を与え、turtleをその角度に向かせるには turtle.setheading() を用います。 例えば、120度の角度に向かせるには turlte.setheading(120) とします。 また、turtle.setheading()の省略形は turtle.seth() です。 向いている角度を確認 turtleが向いている角度を確認するには tur...

Python turtle graphics : スクリーンに文字を書く方法(turtle.write)

イメージ
turtle graphicsでスクリーンに文字を書く 文字入力の例 turtle graphicsで図形を描いているとき、図形だけでなく何かしら文字もスクリーンに入力したい場合もあるでしょう。動作の説明や進んだ距離や曲がる角度などを文字として入力しておくと、より分かりやすい表現が出来るようになります。 turtle graphicsではスクリーンに文字を入力するための turtle.write() というメソッドがあります。 turtle.write() turtle.write()メソッドでスクリーンに文字を入力するとき、簡単には以下のようにします。 turtle.write("Hello world") この場合の出力は以下の図のようになります。turtleのやや右上に指定した"Hello world"というテキストが入力出来ていることが分かりますね。 turtle.write("Hello world") このままでは文字が小さく読み難いですが、turtle.write()を用いる際に引数を指定することで文字サイズなどを調整することも可能です。 turtle.write()の引数 turtle.write()で引数として指定出来るのは以下の4つ。 arg : オブジェクト move : 文字入力の際にturtleも移動させるかどうかの指定(True, False) align : turtleの位置に対し入力する文字の位置の指定(left, center, right) font : フォントの種類、サイズ、フォントタイプの指定 引数を指定する際、例えば全て指定しようとすると以下のようになります。 turtle.write(arg="test text", move=False, align="left" font=("Sans", 24, "bold")) または turtle.write("test text", False, "left", ("Sans", 24, ...

Python turtle graphics 作例 : 五角形を集めて花のような模様を描いてみる(関数作成)

イメージ
動画 完成図(静止画) ソースコード import turtle, random def penta(length):     for i in range(0, 5):         turtle.forward(length)         turtle.left(180-108) def color_red_up(num, step, ini_red, ini_green, ini_blue):     red = ini_red + num / step     green = ini_green     blue = ini_blue     if red > 1.0:         red = 1     if green > 1.0:         green = 0     if blue > 1.0:         blue = 0     return [red, green, blue] def rotate_penta(length, size, step, color):     for i in range(0, 12):         turtle.fillcolor(color_red_up(i, step, color[0], color[1], color[2]))         t...

Python turtle graphics 作例 : 再帰処理を用いた円の描画

イメージ
動画 完成図(静止画) ソースコード import turtle turtle.setup(960,720,0,500) def circ(x):     if x > 200:         return     turtle.circle(x,steps=100)     turtle.left(5)     print(x)     circ(x + 1)     turtle.tracer(5,0) turtle.shape("turtle") turtle.shapesize(1, 1, 1.5) turtle.pencolor(0,0.6,0) turtle.fillcolor(0,1,0) turtle.begin_fill() circ(1) turtle.end_fill() turtle.mainloop() まとめページ Python turtle graphics まとめ スポンサーリンク Amazon商品リンク : Pythonプログラミング関連

Python turtle graphics 作例 : たくさんの木を描いてみる

イメージ
動画 完成図(静止画) ソースコード import turtle, random def tree(length, angle):     if length < 2:         return     turtle.pencolor("brown")     turtle.pensize(5)     turtle.setheading(90)     turtle.forward(length)     turtle.pencolor("green")     turtle.setheading(angle)     turtle.forward(length)     turtle.penup()     turtle.forward(-length)     turtle.pendown()     turtle.pencolor("brown")     turtle.setheading(90)     turtle.forward(length * 0.5)     turtle.pencolor("green")     turtle.setheading(180-angle)     turtle.forward(length)     turtle.penup()     turtle.forward(-length)     turtle.pendown()     tree(l...

Python turtle graphics 作例 : 複数のチェック柄の円

イメージ
動画 完成図(静止画) ソースコード import turtle turtle.setup(960,720,None,None) t1 = turtle.Turtle() t2 = turtle.Turtle() t3 = turtle.Turtle() t4 = turtle.Turtle() t5 = turtle.Turtle() t6 = turtle.Turtle() myturtles = [t1, t2, t3, t4, t5, t6] mycolor = ["red", "orange", "cyan", "green", "blue", "gray"] myr = [36, 30, 24, 18, 12, 6] myradius = [50,50,50,50,50,50] mygoto = [(-300,150), (0,150), (300,150), (-300,-150), (0,-150), (300,-150)] turtle.tracer(10,3) for cnt, num in enumerate(myturtles):     num.speed(10)     num.goto(mygoto[cnt])     num.clear() r_n = min(myr) for i in range(0, 360//r_n):     for cnt, num in enumerate(myturtles):         if 360 > myr[cnt] * i:             num.left(myr[cnt])             num.circle(myradius[cnt], steps=100)  ...

Python turtle graphics : 角度の単位設定(turtle.degrees)

イメージ
Turtle graphicsでの角度の単位 turtle graphicsにおいて角度の単位はデフォルトでは度となっています。設定によりこれをラジアンに変更することも出来ます。 またデフォルトでは一周は360度ですが、任意の数値を一周の値に設定することも出来ます。 turtle.degrees() turtle.degrees()メソッドの括弧内に数値を入れて実行するとその数値が一周の角度となります。例えば turtle.degrees(100) とすると一周が100で表されるようになります。 また、以下のように実行すると初期設定(360度)に戻ります。 turtle.degrees() turtle.radians() turtle.radians() と実行すると角度はラジアンとして扱われるようになります。 (余談 : turtleの向いている方向の確認) ちなみにturtleが向いている角度を確認するには turtle.heading() と実行します。そうするとそのとき向いている角度が返ってきます。 図説 : turtle.degrees()で一周の値を変更した場合について 以下に半径100の円を描く場合について、turtle.degrees()をデフォルト及び100に設定した場合との比較を図示します。 なお、半径100の円を描くには以下のようにturtle.circle()でextentに数値を指定します。 turtle.circle(radius=150, extent=100, steps=None) 見て分かるようにデフォルト(上の円)では途中までしか円が描かれていませんが、一周を100に設定した方(下の円)では一周分描かれています。 図のソースコード import turtle turtle.setup(960,720,None,None) turtle.degrees() turtle.penup() turtle.goto(0, 100) turtle.pendown() turtle.circle(radius=150, extent=100, steps=None) turtle.penup() turtle.goto(0, 70) turt...

Python turtle graphics 作例 : チェック柄の円

イメージ
動画 完成図 ソースコード import turtle turtle.setup(960,720,None,None) turtle.bgcolor("gray80") turtle.shape("turtle") turtle.speed(10) turtle.tracer(1,2) turtle.pencolor("black") turtle.fillcolor("green") r = 10 turtle.begin_fill() for i in range(0, 360//r):     turtle.left(r)     turtle.circle(150, steps=360) turtle.end_fill() turtle.mainloop() まとめページ Python turtle graphics まとめ スポンサーリンク Amazon商品リンク : Pythonプログラミング関連

Python turtle graphics : turtleの前後の移動(forward)

イメージ
turtle graphicsの基本動作 : forward turtle graphicsでturtleを前進させるには turtle.forward() を用います。turtle graphicsにはその他にもいろいろと移動操作はありますが、これが基本となる移動操作です。 省略した書き方 コードを書く時、turtle.forward()は省略して turtle.fd() と書くことも出来ます。 turtle.back() また後進用には turtle.back() もあります。なおturtle.forward()でも負の値を与えることで後進出来るので、今回はturtle.forward()のみ解説します。 turtle.forward()について turtle.forward()は引数に移動する距離を与えて実行すると、その距離だけ前進します。また負の値を与えれば後進します。 前進 turtle.forward() 前進 ソースコード import turtle turtle.setup(960,720,None,None) turtle.shape("turtle") turtle.write("turtle.forward(400)", font=("",18,"bold")) turtle.forward(400) turtle.mainloop() 後進 turtle.forward()後進 ソースコード import turtle turtle.setup(960,720,None,None) turtle.shape("turtle") turtle.write("turtle.forward(-400)", font=("",18,"bold")) turtle.forward(-400) turtle.mainloop() 角度を変えて前進 これだけだとただ前後に動くだけですが、turtle.right()やturtle.left()などで進行角度を変更すれば...

Python turtle graphics : turtleの描画速度設定について

イメージ
turtleの描画速度設定 turtle.speed() turtle graphicsのturtleの進むスピード(描画速度)は turtle.speed() のメソッドにより設定します。引数としては1〜10まで、そして0を指定します。 1が最もturtleの速度が遅く、数が増えるに従い速度が増していきます。 で、10が最も早いと思われるますが、最も早いのは0を設定したときになります。 設定値ごとの速さを比べると以下のようになっています。   0 > 10 > 9 > 8 > 7 > 6 > 5 > 4 > 3 > 2 > 1 以下、動画で説明します。 動画の結果は以下のスクリーンショットの通り。 そして数値ではなく文字列として以下の文言でも指定出来ます。 “slowest" “slow” “normal” “fast” “fastest” ここでは"fastest"が0、"fast"が10、slowestが"1"に対応しています。 ("slow"が3、"normal"が6) 設定は turtle.speed(10) turtle.speed("slow") のように行います。 turtle.delay(), turtle.tracer() さらにturtleの速度を速くしたい場合は turtle.delay() turtle.tracer() を用います。 turtle.delay()は引数に描画遅延をどれくらい取るかをミリ秒で指定します。これを0と設定すると簡単な図形ならほぼ一瞬で描画が完了します。 そしてturlte.tracer()ではスクリーンを更新する間隔と描画遅延の2つの引数を指定します。1ステップ毎ではなくたとえば100ステップをまとめて描画することが出来るので、より高速に描画が行えるようになります。 設定はそれぞれ以下のように行います。 turtle.delay(0) turtle.tracer(100, 0) まとめページ Python turtle gra...

Python turtle graphics - 作例 : 直線と回転のみによる図形

イメージ
直線と回転のみによる図形 Python turtle graphicsで直進(forward)と回転(left)のみで図形を書いてみました。 操作自体はある距離を進んだところで左に曲がり、次は少しだけ距離を増やして再び進んで同じ動作を繰り返すというもの。例としては以下のような感じ。 import turtle turtle.fd(50) turtle.left(80) turtle.fd(55) turtle.left(80) turtle.fd(60) turtle.left(80) turtle.fd(65) turtle.left(80) turtle.fd(70) turtle.left(80) turtle.fd(75) turtle.left(80) turtle.fd(80) turtle.left(80) turtle.fd(85) turtle.left(80) turtle.fd(90) 単純ですね。ただ操作自体は単純ですが、これを何回も繰り返して出来上がった図形はバラエティーに富んでいるのが出来ておもしろいです。例えば、曲がる角度を118.2度ではこのような図形になったりします(直線の長さをどう取るかにも依存しますが)。 ソースコード(操作部分のみ) コードの図形描画操作部分のみ抜き出すと以下の通り。 a = 0 while True:     angle = 16     turtle.left(angle)     turtle.fd(a)     a = a + 2     if a > 550:         break (実際のソースコードは多重ループや描画を速くするような処理も入れているのでもっと長いです) 上のコードでは曲がる角度としてangleという変数を用いています。1つ図形を書き終わったら、この変数を増やして新しい図形を書く、ということを繰り返します。直線の長さは変数aで指定していて曲がる際の増加分は+2としました。こ...

Python turtle graphics : モードのstandardとlogoの違いについて - turtle.mode()

イメージ
turtle graphicsで用いられるモードとは turtle graphicsではいくつかモードを選ぶことが出来ます。ここで言うモードとは初期進行方向と角度がどちら回りなのかなどの違いで区別されています。通常であれば特に必要が無ければモードを変更することはないでしょう。 さてPythonのturtle graphics用意されているモードで主に用いられるのは standard logo の2つ。そしてもう一つ world というのもあり、こちらはユーザーが独自のworld coordinatesを定義した場合にこのモードになります。今回はworldについては解説は省き、starndardとlogoの2つについて解説していきます。   モードの確認、設定方法 使用してるモードを確認するには以下のコマンドを実行します。 turtle.mode() モードを設定するときは例えばlogoモードにするには以下のようにします。 turtle.mode("logo") standardモード turtle graphicsの初期状態ではおそらくこのstarndardモードになっていると思います。このモードでは以下の設定となります。 初期進行方向 : 右向き 角度 : 反時計回り これを次の図を用いて説明します。この図では一定方向進んだところで角度を記述して初期位置に戻り、次に角度を30度増やして再び同じ動作をするということを繰り返しています。初期進行方向が右向きなので、初期位置から真っ直ぐ右に行ったところが0度となっています。そして角度は反時計回りに増えていきます。 (見た時に分かりやすくなるように、角度が増える毎にフォントと矢印のサイズを大きくしていってます) standardモードの図示 logoモード 同様にlogoモードについて説明すると以下のようになります。 初期進行方向 :上向き 角度 : 時計回り さきほどと同様に図で示すと以下の通り。logoモードでは初期進行方向は真上で、角度は時計回りに増えるようになっています。 logoモードの図示 図示に用いたソースコード 図示に用いたソースコードは以下の通り。 import turtle turtle.mode("...

スポンサーリンク