全年全月24日の投稿[29件](2ページ目)
2023年1月 この範囲を時系列順で読む この範囲をファイルに出力する
本業では社内のサーバーやパソコンのメンテをしていますが、処理の待ち時間でC言語のお勉強。
時間についてです。
DMXを扱うには無受信1秒でタイムアウトしなければなりませんし、Delayを構成するには1/30~1/50秒程度のインターバルタイムで受信値をスタックしなければなりません。
ですので、msec(1/1000)クラスの時間評価が必要です。
システムが持つ時間情報を扱うには<time.h>を用い、エポック秒やPOSIX時間などと呼ばれる基準日時(1970年1月1日0時0分0秒(UTC))からの経過時間(secとnsec)を使うのがよいと思います。有効な精度は10usec程度の様ですが、今現在書いている処理では十分です。これを処理の節目でスタックして経過時間を評価するのですが、年月日時でパラメータが分かれているよりもトータル秒数の方が扱いが簡単です。23時59分59秒の1秒後に0時0分0秒にならないタイマで継続した時間評価をしたいのでこの方がいいと思います。
ただ、スタックする変数のバイト長には気を付けないといけません。secもnsecもそれぞれ4バイト数なので評価をするには8バイト数で考えないといけないからです。64bitOSならint型でも8バイト数なことが多いので問題ありませんが、私はRaspberryPiで32bitOSを使っているのでint型は4バイト数になります。対策には8バイト数である「(unsigned) long long int」型を使います。ちょっとクセがある型なので計算やprintfで注意しないといけませんケドね。
#C言語
時間についてです。
DMXを扱うには無受信1秒でタイムアウトしなければなりませんし、Delayを構成するには1/30~1/50秒程度のインターバルタイムで受信値をスタックしなければなりません。
ですので、msec(1/1000)クラスの時間評価が必要です。
システムが持つ時間情報を扱うには<time.h>を用い、エポック秒やPOSIX時間などと呼ばれる基準日時(1970年1月1日0時0分0秒(UTC))からの経過時間(secとnsec)を使うのがよいと思います。有効な精度は10usec程度の様ですが、今現在書いている処理では十分です。これを処理の節目でスタックして経過時間を評価するのですが、年月日時でパラメータが分かれているよりもトータル秒数の方が扱いが簡単です。23時59分59秒の1秒後に0時0分0秒にならないタイマで継続した時間評価をしたいのでこの方がいいと思います。
ただ、スタックする変数のバイト長には気を付けないといけません。secもnsecもそれぞれ4バイト数なので評価をするには8バイト数で考えないといけないからです。64bitOSならint型でも8バイト数なことが多いので問題ありませんが、私はRaspberryPiで32bitOSを使っているのでint型は4バイト数になります。対策には8バイト数である「(unsigned) long long int」型を使います。ちょっとクセがある型なので計算やprintfで注意しないといけませんケドね。
#C言語
オレメモであります。
参考になりそうな先達のページ
● UDP/IP通信全体の参考
UDP / IP でパケットの送受信を行う
● broadcast通信の参考
UDPブロードキャスト送信サンプル
● ネットワークデバイスを指定した通信の参考
Ethernetインターフェース(eth0, eth1)を指定してソケットを作成する (Linux, C, Raspberry Pi)
● 受信タイムアウトの参考
selectを使用してタイムアウト付き受信を実現する <= recvもrecvfromも受信があるまでひたすら待ち続けるので、タイムアウトさせることは必須。
UDP通信におけるselectの使い方。 <= recvの例が多い中、recvfromの書式を確認出来る。recvfromを使う理由は送信元アドレスを取得したいから。
● 時間の扱い方
時間情報の取得方法と扱い方 <= これの5ページ目の「POSIX環境」が結構大事。DelayをするにもDMXのタイムアウトをするにもこれが必要。
● ターミナルの行長と行数を取得する
ターミナルのサイズを取得する
ターミナルの幅と高さを得る
● ANSIエスケープシーケンス
ANSIエスケープシーケンス チートシート
この辺りを参考にすれば「ネットワークデバイスを指定してbroadcastで通信する」が出来そうな気がします。
ただし、1行々々読み込んで使われている構造体をよく把握することが大切です。構造体の中に必要な情報が隠れていることが多いからです。構造体の中に構造体があったりもするので、十分に読み込まないといけません。
実験は受信が当面の課題となり、
1)ネットワークデバイスを指定せずArt-Netを受信する。<= とにかく受信する
2)ネットワークデバイスを指定してArt-Netを受信する。<= ネットワークデバイスを制限して受信する。
3)送信元IPアドレスを取得し、IPアドレスをもとに受信値を振り分ける。<= 複数の送信元(卓)がある場合の不確実性排除とミックス処理のためには不可欠。
といった手順で進めることになろうかと思います。
受信値を確認するため、習作を兼ね、バイナリをダンプ表示をするライブラリも作ってみましょう。
#C言語 #[Art-Net]
参考になりそうな先達のページ
● UDP/IP通信全体の参考
UDP / IP でパケットの送受信を行う
● broadcast通信の参考
UDPブロードキャスト送信サンプル
● ネットワークデバイスを指定した通信の参考
Ethernetインターフェース(eth0, eth1)を指定してソケットを作成する (Linux, C, Raspberry Pi)
● 受信タイムアウトの参考
selectを使用してタイムアウト付き受信を実現する <= recvもrecvfromも受信があるまでひたすら待ち続けるので、タイムアウトさせることは必須。
UDP通信におけるselectの使い方。 <= recvの例が多い中、recvfromの書式を確認出来る。recvfromを使う理由は送信元アドレスを取得したいから。
● 時間の扱い方
時間情報の取得方法と扱い方 <= これの5ページ目の「POSIX環境」が結構大事。DelayをするにもDMXのタイムアウトをするにもこれが必要。
● ターミナルの行長と行数を取得する
ターミナルのサイズを取得する
ターミナルの幅と高さを得る
● ANSIエスケープシーケンス
ANSIエスケープシーケンス チートシート
この辺りを参考にすれば「ネットワークデバイスを指定してbroadcastで通信する」が出来そうな気がします。
ただし、1行々々読み込んで使われている構造体をよく把握することが大切です。構造体の中に必要な情報が隠れていることが多いからです。構造体の中に構造体があったりもするので、十分に読み込まないといけません。
実験は受信が当面の課題となり、
1)ネットワークデバイスを指定せずArt-Netを受信する。<= とにかく受信する
2)ネットワークデバイスを指定してArt-Netを受信する。<= ネットワークデバイスを制限して受信する。
3)送信元IPアドレスを取得し、IPアドレスをもとに受信値を振り分ける。<= 複数の送信元(卓)がある場合の不確実性排除とミックス処理のためには不可欠。
といった手順で進めることになろうかと思います。
受信値を確認するため、習作を兼ね、バイナリをダンプ表示をするライブラリも作ってみましょう。
#C言語 #[Art-Net]
RTCを装着したRaspberryPiは正常のようです。
今後製作する装置にもRTCを装着したいのですが、電池切れをどうやって拾うか思案中です。
socketの実験は連休中に時間が取れず未対応です。
Art-Netの受信と送信を1台でこなすにはIPアドレス的には同じゾーンで装置は別という変な構成になります。その上、broadcastで受けてbroadcastで送るというこれもまた変な構成です。ですので、コピペで使える先例がありそうでありません。
RaspberryPiのPythonでは成功していることですから可能だと思いますが、C言語のsocketの方が設定すべきパラメータが多いため、Pythonには無かった設定をどうするかが難問なのです。難しいというより、「ネットワークデバイスを指定してbroadcastで通信する」という前提の先例が少なく、沢山のデータシートを継ぎハギしないと見えないことが多いために苦心しているところです。
#RaspberryPi #C言語 #[Art-Net]
今後製作する装置にもRTCを装着したいのですが、電池切れをどうやって拾うか思案中です。
socketの実験は連休中に時間が取れず未対応です。
Art-Netの受信と送信を1台でこなすにはIPアドレス的には同じゾーンで装置は別という変な構成になります。その上、broadcastで受けてbroadcastで送るというこれもまた変な構成です。ですので、コピペで使える先例がありそうでありません。
RaspberryPiのPythonでは成功していることですから可能だと思いますが、C言語のsocketの方が設定すべきパラメータが多いため、Pythonには無かった設定をどうするかが難問なのです。難しいというより、「ネットワークデバイスを指定してbroadcastで通信する」という前提の先例が少なく、沢山のデータシートを継ぎハギしないと見えないことが多いために苦心しているところです。
#RaspberryPi #C言語 #[Art-Net]
2022年8月 この範囲を時系列順で読む この範囲をファイルに出力する
帰宅して確認したところ裸族のPiがチンチンに熱くなって止まっていました。
HDD4台同時にフォーマットを実行しましたので過負荷だったのかな?
とりあえず冷ましてHDDを1台毎に再フォーマット。
#ガチ工作
HDD4台同時にフォーマットを実行しましたので過負荷だったのかな?
とりあえず冷ましてHDDを1台毎に再フォーマット。
#ガチ工作
作業部屋があまりに酷い。自分以外の人が見たら単なるゴミ部屋状態で作業がし難い。
とりあえず、分解されている品からボチボチ仕上げることにしました。
まずは、センチュリー社製の「裸族のカプセルホテル」にRaspberryPi4Bを内蔵した「裸族のPi」を1台仕上げました。
RaspberryPi4Bを手に入れるのに難儀しましたが組まないと意味がありません。
動作確認を兼ねてHDDのフォーマット大会をしています。
#ガチ工作 #RaspberryPi
とりあえず、分解されている品からボチボチ仕上げることにしました。
まずは、センチュリー社製の「裸族のカプセルホテル」にRaspberryPi4Bを内蔵した「裸族のPi」を1台仕上げました。
RaspberryPi4Bを手に入れるのに難儀しましたが組まないと意味がありません。
動作確認を兼ねてHDDのフォーマット大会をしています。
#ガチ工作 #RaspberryPi
2022年7月 この範囲を時系列順で読む この範囲をファイルに出力する
これまではPIC16系でI2Cを扱う方法はデータシートを読んでも理解出来なかったのですが、次のページのサンプルプログラムを読みながらフラグの意味を整理したところなんとなくわかってきました。
「I2Cのスレーブモードの使い方」
サンプルソースはPIC18系っぽいですが、違いを読み変えればPIC16系のサンプルにもなります。
SPIもそうですが、シフトレジスタ系の通信方法で重要なことは受信値を処理して次の受信コンディションが整うまで送信を一次停止させることです。
I2Cではこの処理をハードウェア的に行うことが可能です。SSPCON2:SENをセット(フラグを1に)しておくと1バイトの受信が終わったところでクロックストレッチングと呼ばれる一時停止がハードウェア的に自動発生するモードになります。クロックストレッチングを解除し受信コンディションにするにはSSPCON1:CKPをセットするだけです。
スレーブ受信処理の流れは、
1)SSPCON2:SENとSSPCON1:CKPをセットして受信コンディションにする(SSPCON2:SENのセットは初期化処理の時だけでいい)
2)バイトデータが受信されたらSSPBUFからデータを取り出す(この時点でSSPCON1:CKPはハードウェアでクリアされクロックストレッチングが発生している)
3)データを取り出したら(取り出したデータの処理が済んだら)SSPCON1:CKPをセットし次の受信コンディションにする
4)以下、ストップビットが検出されるまで(2)から繰り返し
となります。
スレーブ送信(返信)の場合も同様で、所定のレジスタにデータを入れた後、SSPCON1:CKPをセットするとマスターがクロックを刻み始めて送信となります。
所定のレジスタにデータを入れると自動的にSSPCON1:CKPがセットされて送信が始まるモードもあるようです。
ただ、SSPCON3:AHENとSSPCON3:DHENの意味がわかったようなわからないような状況です。両方ともクリア(=0)で良いような気もしますが、便利機能かもしれないのでデータシートを良く読んで整理しましょう。
I2Cは敷居が高いイメージがありましたが、ハードウェアによる自動処理が多くソフトウェアで細かいタイミングを考える必要が無いため、この調子で整理していけば案外簡単に使えるかもしれません。
PICでI2Cを扱うことが可能になれば、今回のパラレルバスLCDなどのI2Cに対応していないデバイスをI2C化することが容易になります。
通信速度や即応性、RTOS的なリアルタイム性を求めるのは難しいと思われますが、7bitアドレスのノーマルモードでもI2Cバス上に126個のデバイスを置けますので、RaspberryPi、Arduino、ESP32などの製作の幅が広がるような気がします。
#電子工作
「I2Cのスレーブモードの使い方」
サンプルソースはPIC18系っぽいですが、違いを読み変えればPIC16系のサンプルにもなります。
SPIもそうですが、シフトレジスタ系の通信方法で重要なことは受信値を処理して次の受信コンディションが整うまで送信を一次停止させることです。
I2Cではこの処理をハードウェア的に行うことが可能です。SSPCON2:SENをセット(フラグを1に)しておくと1バイトの受信が終わったところでクロックストレッチングと呼ばれる一時停止がハードウェア的に自動発生するモードになります。クロックストレッチングを解除し受信コンディションにするにはSSPCON1:CKPをセットするだけです。
スレーブ受信処理の流れは、
1)SSPCON2:SENとSSPCON1:CKPをセットして受信コンディションにする(SSPCON2:SENのセットは初期化処理の時だけでいい)
2)バイトデータが受信されたらSSPBUFからデータを取り出す(この時点でSSPCON1:CKPはハードウェアでクリアされクロックストレッチングが発生している)
3)データを取り出したら(取り出したデータの処理が済んだら)SSPCON1:CKPをセットし次の受信コンディションにする
4)以下、ストップビットが検出されるまで(2)から繰り返し
となります。
スレーブ送信(返信)の場合も同様で、所定のレジスタにデータを入れた後、SSPCON1:CKPをセットするとマスターがクロックを刻み始めて送信となります。
所定のレジスタにデータを入れると自動的にSSPCON1:CKPがセットされて送信が始まるモードもあるようです。
ただ、SSPCON3:AHENとSSPCON3:DHENの意味がわかったようなわからないような状況です。両方ともクリア(=0)で良いような気もしますが、便利機能かもしれないのでデータシートを良く読んで整理しましょう。
I2Cは敷居が高いイメージがありましたが、ハードウェアによる自動処理が多くソフトウェアで細かいタイミングを考える必要が無いため、この調子で整理していけば案外簡単に使えるかもしれません。
PICでI2Cを扱うことが可能になれば、今回のパラレルバスLCDなどのI2Cに対応していないデバイスをI2C化することが容易になります。
通信速度や即応性、RTOS的なリアルタイム性を求めるのは難しいと思われますが、7bitアドレスのノーマルモードでもI2Cバス上に126個のデバイスを置けますので、RaspberryPi、Arduino、ESP32などの製作の幅が広がるような気がします。
#電子工作
色んなデバイスを考えますと表示装置は避けて通れない課題となります。
数個のLEDで済む事もありますが、ガッツリモニタを組まないといけない事もあります。この中間が望ましいこともあります。
案外必要にして十分なのが16字×2行や20字×4行くらいのLCDディスプレイモジュールです。ただ、制御は難しくありませんが、パラレル信号なので面倒が少なくありません。ならばエスケープシーケンスをシリアルやI2cで受けて動く様にしたらどうかと。PICでインターフェースを作るワケです。
幸い16F1939が沢山あるのでコレを使えばI/Oピンに余裕を持って作れます。
色んなアイデアを出しても製作が進まないのは補助的な周辺機器を作らんからかもしれません。
#ガチ工作 #電子工作
数個のLEDで済む事もありますが、ガッツリモニタを組まないといけない事もあります。この中間が望ましいこともあります。
案外必要にして十分なのが16字×2行や20字×4行くらいのLCDディスプレイモジュールです。ただ、制御は難しくありませんが、パラレル信号なので面倒が少なくありません。ならばエスケープシーケンスをシリアルやI2cで受けて動く様にしたらどうかと。PICでインターフェースを作るワケです。
幸い16F1939が沢山あるのでコレを使えばI/Oピンに余裕を持って作れます。
色んなアイデアを出しても製作が進まないのは補助的な周辺機器を作らんからかもしれません。
#ガチ工作 #電子工作
2022年6月 この範囲を時系列順で読む この範囲をファイルに出力する
RaspberryPi4Bがどうしても必要になったので、すこしお高いamazonでポチリました。
それがなんと中1日で入荷。あるところにはあるんですねぇ。やはり買い占め転売されているのかな?
イギリスにオーダーした物は操作を間違えたのか何なのかキャンセルになっていました。もちろん今は在庫なし。
追記
千石電商さんにRaspberryPi4Bの4GBモデルと8GBモデルが出ていました。お一人様1個ですが手に入るのはありがたい。
価格はネットの小売り界隈では最安値。もちろん過去の最安値よりはお高いですが、RaspberryPiが入手しずらくなる直前の価格とほぼ同等。半導体不足や円相場を考えれば良心的過ぎ。市場原理はアリアリでも本家は定価で出していますから、2万前後の価格は乗せすぎだと思うのですけどね。
RaspberryPi4Bは自宅サーバーの分も含めて10個くらい欲しいのでポチリました。
#RaspberryPi
それがなんと中1日で入荷。あるところにはあるんですねぇ。やはり買い占め転売されているのかな?
イギリスにオーダーした物は操作を間違えたのか何なのかキャンセルになっていました。もちろん今は在庫なし。
追記
千石電商さんにRaspberryPi4Bの4GBモデルと8GBモデルが出ていました。お一人様1個ですが手に入るのはありがたい。
価格はネットの小売り界隈では最安値。もちろん過去の最安値よりはお高いですが、RaspberryPiが入手しずらくなる直前の価格とほぼ同等。半導体不足や円相場を考えれば良心的過ぎ。市場原理はアリアリでも本家は定価で出していますから、2万前後の価格は乗せすぎだと思うのですけどね。
RaspberryPi4Bは自宅サーバーの分も含めて10個くらい欲しいのでポチリました。
#RaspberryPi
2022年3月 この範囲を時系列順で読む この範囲をファイルに出力する
勇み足で手配してしまった3Dシュミレーターに使うパソコンが入荷しました。以前のが復活したのでダブつき状況ですが、予備機があるのは悪くありません。ヤフオクとはいえ専門店からですが、中一日とは早いですね。
これのセッティングは来週以降になりそうですが、古いとはいえ、こんなにキレイな物が1万円しないとは驚きです。32bitのWindows10が入っていますので、メモリを追加して64bitにしようと思います。メモリの規格は一世代前のDDR3ですが、半導体不足でも古い規格の流通在庫品は値段が上がっていないようです。
#パソコン
これのセッティングは来週以降になりそうですが、古いとはいえ、こんなにキレイな物が1万円しないとは驚きです。32bitのWindows10が入っていますので、メモリを追加して64bitにしようと思います。メモリの規格は一世代前のDDR3ですが、半導体不足でも古い規格の流通在庫品は値段が上がっていないようです。
#パソコン
2022年2月 この範囲を時系列順で読む この範囲をファイルに出力する
Pythonはオブジェクト指向な書き方が出来ると驚くほど書きやすいですね。人気No.1言語なのが納得です。
継承におけるsuper()の使い方が感覚に入ってきていませんが、今日書いたテキスト画面の基本制御classを継承して定型画面を表示するclassを書いて習得しましょう。
出来るだけ細かくclassで書いておけばC++への移植で都合が良いかもしれません。C++はゴリゴリのオブジェクト指向言語ですから、方言的な違いをclass単位でホローすれば全体の構造はそのまま行けるだろうという皮算用です。もしくは、全部をC++化しなくても、重い処理や繰り返しが多い処理だけPythonにimport出来るクラス・ライブラリとしてC++で書き直せば良いかもしれません。
#Python
継承におけるsuper()の使い方が感覚に入ってきていませんが、今日書いたテキスト画面の基本制御classを継承して定型画面を表示するclassを書いて習得しましょう。
出来るだけ細かくclassで書いておけばC++への移植で都合が良いかもしれません。C++はゴリゴリのオブジェクト指向言語ですから、方言的な違いをclass単位でホローすれば全体の構造はそのまま行けるだろうという皮算用です。もしくは、全部をC++化しなくても、重い処理や繰り返しが多い処理だけPythonにimport出来るクラス・ライブラリとしてC++で書き直せば良いかもしれません。
#Python