🗐 電装工芸日記 - 舞台照明機器の製作とか -

今年は開発案件を進めたい

or 管理画面へ

全年全月27日の投稿[43件](3ページ目)

2023年1月 この範囲を時系列順で読む この範囲をファイルに出力する

Icon of admin
 ANSI-CというかLinuxのC言語ではキー入力は「待ち」が基本です。何かキーが入力されるとか、Enterを押されるまで処理が一時停止します。それでも構わないこともありますが、ダメな時もあります。
 WindowsならDxLib.hを使って様々な入力を直に得ることが出来ますが、ANSI-Cの標準ライブラリには同様の物がありません。
 そこで、キー入力があれば受け付け、無いなら飛ばして次に行く処理を作ってみました。キー入力はOSがバッファしているので、これを覗く形です。

Raspberry Pi 4B / Rasbian11_32bit(blueseye) / OS標準gcc
/* ---------------------------------
  リアルタイムにキー入力をチェックする
  --------------------------------- */
/* getcharはキー入力のキャッシュが空だと入力があるまで待つ。
  キャッシュが無いなら無いでそのまま抜けたいが、タイムアウトを設定しても
  抜けない。環境に寄るのかもしれないが、ioctl.hを用いることで
  タイムアウトが実現できた。
*/

/* ライブラリ読み込み */
#include <stdio.h>
#include <sys/ioctl.h>
#include <termios.h>
#include <unistd.h>

/* 定数設定 */
#define SET 1        // ioctl.readのモードをRawにするフラグ
#define RESET 0       // ipctl.readのモードをCanonicalに戻すフラグ

/* プロトタイプ宣言 */
int get_inkey( char *get_char ) ;  // キー入力を取得する関数
  // char *get_char  取得したキーコードを返すポインタ
int set_inkey( int mode_flag ) ;  // キー入力のモードを設定する関数
  // int mode_flag  モードの設定フラグ 1(SET)=Rawモードにする / 0(CLR)=モードを戻す

/* テスト用main */
int main(void) {
  char in_char = 0 ;   // 入力されたキーコードを保存する変数
  int ret_inkey = 0 ;   // get_inkeyからの戻り値を保存する変数
  /* コンソールの設定を初期化 */
  set_inkey( SET ) ;
  /* 無限ループで入力したキーを表示する */
  for(;;) {
    // get_inkeyから1文字取得
    in_char = 0x00 ;          // 事前初期化
    ret_inkey = get_inkey( &in_char ) ; // キー取得
    /* get_inkeyの戻り値を処理 */
    // 戻り値が-1ならエラーなのでループから抜けて終了
    if( ret_inkey == -1 ) {
      break ;
    // エンターキーが押されたならループを抜けて終了
    } else if( in_char == 0x0A ) {
      break ;
    // 入力された文字を出力する・・・表示可能な文字
    } else if( in_char >= 0x20 && in_char <= 0x7F ) {
      printf( " %c<%02X>", in_char, in_char ) ;
    // 入力された文字を出力する・・・表示不可能な文字
    } else if( in_char > 0x00 && in_char <= 0xFF ) {
      printf( " <%02X>", in_char ) ;
    }
    fflush( stdout ) ; // 画面表示のスタックを吐き出す   
  }
  /* 正常終了 */
  printf( "\n" ) ;    // 念のための改行
  set_inkey( RESET ) ;  // コンソールの設定を元に戻す
  return 0 ;
}

/* キー入力を取得する */
int get_inkey( char *get_char) {
  char in_char = 0 ;     // 入力されたキーを保持
  char read_length = 0 ;   // 読み込んだバイト数

  // readを使って標準入力から1文字取得
  read_length = read( 0, &in_char, 1 ) ;
  // read_lengthが-1ならエラー、それ以外なら正常
  if( read_length != -1 ) {  // 正常なので取得値を返す
    *get_char = in_char ;
  } else {          // エラーなので以上通知
    *get_char = 0x00 ;
    set_inkey( RESET ) ;
    return -1 ;
  }
  return 0;
}

/* キー入力のモードを設定する */
int set_inkey( int mode_flag ) {
  static struct termio tty_backup;    // 変更前の設定を保持
  static struct termio tty_change;    // 変更後の設定を保持
  // モードを設定する
  if( mode_flag == SET ) {
    // 現在の設定をスタック
    ioctl(0, TCGETA, &tty_backup);
    tty_change = tty_backup;
    // 設定を変更
    tty_change.c_lflag &= ~( ECHO | ICANON ) ;   // エコーを止め、RAW モードへ変更
    tty_change.c_cc[VMIN]= 0 ;          // 0文字入力された時点で入力を受け取る
    tty_change.c_cc[VTIME] = 0.01 ;        // 何も入力がなくても1msec待つ (1 = 1/10sec)
    ioctl( 0, TCSETAF, &tty_change ) ;       // ここで設定を反映
  // モードを戻す
  } else if( mode_flag == 0 ) {
    // スタックしていた設定に戻す
    ioctl( 0, TCSETAF, &tty_backup ) ;
  }
  return 0;
}


 同じ感じでgetcharを使ってもいいような情報が多かったのですが、RaspberryPiのblueseyeではこの方法でないとキー入力があるまで一時停止してしまいます。
 Pythonでも同様の処理を書いたことがありますが、C言語の方が圧倒的にレスポンスがいいです。
 矢印キーがANSIエスケープシーケンスのコードで取得できたことには驚きましたが、ファンクションキーも含め、getcharでは取得できないこともあるキーも取得出来て満足。
 ただし、シフトキーなどの装飾キーを単体で取得することは出来ません。

#C言語

2022年12月 この範囲を時系列順で読む この範囲をファイルに出力する

Icon of admin
 C言語を習得する壁として代表的な機能は、
1)ポインタ
2)構造体、共有体
3)typedef(自分なりの変数の型を定義する)
 でしょうか。
 ポインタは以前も書きましたが、変数をアドレス値で読み書きする方法です。CPU、メモリ、デバイスというハードウェアの基本要素が頭に入ってないと捉えにくいのですが、わかればシンプルだと思います。
 構造体はPythonで言うところのタプルみたいなものです。
 共有体は機能はわかっても意味がイマイチピンときませんが、高度なことを書く際に便利なのでしょう。
 typedefにはじんわりとオブジェクト指向を感じますが、データベースにアクセスするなど、構造体を多用する際に便利な気がします。
 他は計算記述とループコマンドですが、これらは方言のレベルで受け入れればいいようです。配列に対する計算はPythonと少し違うみたいなので整理が必要です。
 要所の基本は理解できたっぽいので、とにかく書いて慣れることですね。
 呆れる程書いて体に馴染ませたPICのアセンブラ並にC言語を書けるようになれたら御の字です。

 実習はこれからですが、共有メモリも見えてきました。
 名前のままですが、複数のプロセスからアクセス(共有)できるメモリ領域を定義する方法です。
 mmap(メモリマップドファイル)とかpipeに似ていますが、mmapはRAMディスク上のファイルを共有するイメージで、pipeは変数の内容をシステムを通じて送受信するイメージです。どれもプロセス間で情報を共有する手段ですが、共有メモリはこの中でもローレベルでシンプルな方法だと思います。ローレベルすなわち速度が期待でき、最初の定義は面倒だけど定義さえ済めば単なる変数として扱えます。
 今時のOSは特定のプロセスがアクセスできるメモリ領域を制限することで動作の安定とセキュリティ(セキュア)を担保します。このため、別プロセスの領域にある変数(メモリ)にはポインタを使ってもアクセス出来ないのです。
 MS-DOSなどの初期のOSではありえなかった制限ですが、利便性とセキュアは矛盾するシステム要件ですから、抜け道として共有メモリが用意されたのしょう。アクセスが許可されたプロセスからはただのメモリ領域ですからポインタで普通に読み書き出来ます。動作速度が通常変数と大差ないのも嬉しい。
 共有メモリを定義して得られる情報はID、先頭アドレス、メモリサイズ、パーミッションだけです。OSやコンパイラがマネージしてくれない変数ですから、メモリに展開する構造体を手作業で管理しなければなりません。読み書きもマネージしれくれませんので、プロセス間で動作が衝突して誤動作に繋がる可能性があるので、セマフォを使うなり、データを一方通行にするなりして対策する必要もあります。この辺りはPICのアセンブラと同じですけどね。

 学んでて思うのですが、C言語はアセンブラを抽象化して書きやすくしたものだとするのが私には自然です。アセンブラを補助するマクロ集を膨らませていったらマクロ命令だけでもプログラムソースが書けるようになってしまい、ならばマクロの内容を整理したら更に便利ぢゃね?となったんじゃないかと勝手に想像しています。プログラム言語としてJAVAやPythonと同類に位置付けされますが、性根のところでは別分野の代物なんですよ。学ぶ側にとっては、俗に言う高級言語に分類するから逆に理解し難いんだと思うのです。ハードウェアが直に読むマシンコードを便利マクロだけで書くと思えばポインタなどは超お気楽な便利機能に見えてきます。
 つーて、アセンブラとかマシンコードって何?って聞かれてしまうと困ります。色彩をカラーフィルターの番号と光源のレベルで例えてしまう照明屋の言葉が一般には通じないことと同じです。

#C言語
Icon of admin
 ライトアップのご依頼が多くなっています。
 自家製の制御システムがあるので安く提供出来るのが強みですが、このところはリレーやタイマーが手に入らず難儀してました。
 今月に入ってダメもとでモノタロウさんを見直したところ在庫あり。メーカーのサイトを見ると「供給量が少ないのでご注意ください」とはあれど供給は復活している。
 速攻でオーダー。
 リレーはOMRONさんのG7L-2A-BUBですが、フランジ形状なので取り付けが楽で、小型で動作電流も少なく、20A流せるので使い勝手が良いリレーです。AC100vで駆動する物を主に使いますが、制御用のDC電源が不要だし、横繋ぎで動かせるし、既設のタイマーで動いているAC100v負荷があれば制御信号として電源を盗み出して使うことも出来ます。
 タイマーも数量限定ながら手に入りました。近い将来IoT化するつもりですが、電源の制御はシンプルなタイマーリレーに限ります。

#本業 #ガチ工作
Icon of admin
「行燈」を作らねばなりません。
 灯台の様な円筒の建物のライトアップを依頼されているのですが、歴史のある代物なので落ち着いた雰囲気にしたいと。
 建築デザイン的に窓の存在感が強いのでライトアップでも窓を主張したいと。
 カーテンを付けて光を透かせばいいのですが、ライトアップをしない面の窓からは出来るだけ光を漏らしたくないと。
 と、なりますと、内側から窓に向けた面だけが光る「箱」をこさえねばなりません。「行燈」なワケです。
 お金も手間も時間もかけられないし、どうしたものかと思案しておりますが、看板屋さんの知恵と資材を使わせてもらうことにしました。
 全体を木枠で作り、光を漏らしたくない面には肉厚のターポリンを張り、光らせる面にはノボリ看板で使う生地を張ります。相手物が相手物ですから防炎素材を使わないといけませんが、看板で使う素材は余程の安物でなければ防炎素材。
 ちょいと年末年始休暇を減らして製作ですねぇ。

#本業 #ガチ工作

2022年11月 この範囲を時系列順で読む この範囲をファイルに出力する

Icon of admin
 こんなん試作ってみました。
20221127203406-admin.jpg
 ケーブルをリングスリーブで接続した際のカバーですが、防滴のブンキーになったらいいなと。
 3Dプリンタの精度確認をしたかったので、現場で待ち時間が長かった時に描いたデータをプリント。精度確認の目的でもありますが、外皮をかなり肉厚にしてインフィルも細かくしたので強度はありそうです。バイスに挟んでハンマーで叩いたり、コンクリ目掛けて投げつけて壊れなければ使えるかなと。どのくらいで壊れるかを試すのも大事。いや、試作の醍醐味(笑
 水没に耐えられる完全な防水は目指してはいませんが、雨風を受けてもへっちゃらならOKです。

#3D #照明器具

2022年9月 この範囲を時系列順で読む この範囲をファイルに出力する

Icon of admin
 鬼のデスクワーク中ですが、資料映像のレンダリング中は休憩です。
 気分を切り替えるのにクリアカムのパワーサプライのケースを作っています。
 ケース本体は中華電機製ですが、これを黒に塗装。ミッチャクロンを下地にしますが偉大な下地材です。凄い喰い付き。
 コネクタやスイッチを取り付けるフロントとリアのパネルは3Dプリンタでプリントした物にレーザープリンタで出力した紙をラミネートしたシートを貼ります。以前もご紹介しましたが、耐水紙に印刷してツヤ無しのラミネートで挟んだ物です。これは舞台のマーキングにも使えるなかなか優れた代物ですが、ケースのパネルの装飾に使うとかなりそれっぽくなります。

#ガチ工作
Icon of admin
 クリアカムのパワーサプライはA/B2系統としA+Bのパーティにも切り替えられるようにします。
 仕組みは、AとBそれぞれにターミネーターを入れ、A+BのパーティにするならBのターミネーターを切り離してAと繋ぎます。極々ありふれたスイッチ1つで出来ます。
 2系統必要なことは滅多にないけれど便利かもしれないし、コストも手間も大してかからないので、どうせ作るなら実装しておこうかなと。

#電子工作
Icon of admin
 クリアカムのパワーサプライに使おうと思っている電源がコレ。
20220927072527-admin.jpg
 24v9Aですから219wです。
 このサイズで???

 以前、スクローラーを作った時に使ったデンセイ・ラムダ(現TDKラムダ)の150w電源は遥かに大きい。
 時代が進んで小型化したか、性能を表す基準が違うか、どちらかなんでしょうけど、どちらでしょう。
 先日購入したLED-BARでは電流過多が原因と思われる電圧低下で動作不良になった物があったことから、中華電機の電源モジュールの定格表現は日本のそれとは違う気がします。
 日本製の定格は連続使用に耐えうる数値、中華電機製のは動作不良が始まる限界値と思うのがいいのかもしれません。
 どちらがいいか悪いかではなく、持っている数値をどう見てどう扱うかです。基本は安全率の定義です。日本製は部品劣化を見込んで80%を実用上限とし、中華電機製は部品劣化の80%に加え安定動作のための余力60%を合わせ48%くらいで見ればいいのかな?これだと4.32Aとなり約100wです。物理的なサイズ感からしてもこの位が現実的な気がします。大雑把に言うなら、連続使用に耐えうる最大電流値を定格の半分とするのです(出力側のチョークコイルがやたら小さいのでまだ不足感はありますけど・・・)。
 今回の基板は見た目がキレイです。部品配置が整っていてハンダやネジ止めが丁寧って意味ですが、性能(主に耐久性)は見た目にも表れます。この辺りに粗雑感があるなら安全率をもっと下げて使うべきでしょう。根拠を数値で表すのは無理ですけど。

 正直、中華電機の電源モジュールをDMXスプリッターなどに使うのはまだ怖いです。中華製の器具にはこの親族が使われているのですから神経質になり過ぎなくてもいいのですが、以後に沢山の機器が繋がる用品、「壊れたら交換すればいいぢゃん!」で済まない用品に使っていいかは今後考えないといけません。

 パワーサプライの実装では電源経路にローパスフィルタ(ハイカットフィルタ)とリセッタブルヒューズが必要です。電源モジュールのバッファコンデンサが妙に小さいので、容量の大きな電解コンデンサを簡易ローパスフィルタも兼ねて追加してみましょう。

 つわけで、片手間で作れるクリアカムのパワーサプライをいじって息抜きをしています。

#電子工作

2022年8月 この範囲を時系列順で読む この範囲をファイルに出力する

Icon of admin
 mdadmに問題発生!
 マウントして使えるところまで設定出来たと思ったのに、再起動したらmdadmがエラーを吐いてコンソールが起動しない。これでは手直しも出来ません。
 仕方ないので最初から組み直し。
 ディスクのフォーマットやRAID1の同期には半日くらいかかりますが、その他の操作は数分で終わるのでいいかなと。使い始めてからエラーになるよりマシだし。

 ひょっとするとですが、裸族のカプセルホテルはクーリングがイマイチなのでサーマルプロテクトで何かあったかな?
 RaspberryPiのCPU温度が70度近くになっていたので高いなぁ~とは思っていたのでが・・・
 試しに外枠を外した状態で再構成をしてます。これで通れば横っ腹に大穴を空けますかね。

#サーバー #RaspberryPi
Icon of admin
 ソフトウェアRAIDを構成するmdadmの虎の巻を作り直しました。作成、削除、ディスクの入れ替え、ディスクをリユースするための初期化方法などです。

 単に作成するだけの俺様手順を説明している情報はネットに沢山ありますが、mdadmを扱うための「そもそも」の情報は少なく、一度RAIDで使ったディスクを別環境で使うと発生しやすい/dev/md127問題の対処方法などは見つかり難かったりします。
 ネットの情報に頼らずman(Linuxの中にある電子マニュアル)を熟読しなさいって話ではありますが、これはLinuxを十分に理解している人に向けた覚書であり、初級者にとっては草書体で書かれた巻物にも等しい存在です。
 理解した体でネットに情報を書くなら自分が理解してきた起承転結に基づいて書いて欲しいものです。「結」しか書かれていないのがほとんどなので、コピペで動けばいいけど、試行錯誤の参考にならんのです。言い方は悪いですが、有益な情報が隠れてしまうからゴミ情報を増やすなと言いたい。

 今は虎の巻の検証作業をしています。数年後の自分が参加にできるモノを作っておかないといけません。

 ついでにexim4の虎の巻もまとめました。これはメールエージェントです。postfixほど多芸ではありませんが、軽いし基本的なことは十分に出来ます。
 postfix同様にクライアント向けのメールサーバーとして機能させることも出来ますが、ユーザーにとってのOutlookやThenderbirdよろしく、サーバーがメールを送信するメールクライアントの様に構成することも出来ます。
 サーバー管理はログを読んでコンディションを知るのが基本ですが、サーバーからのお知らせメールが普段使いのメールに転送されると便利です。こういったメールをログメールやアラートメールと呼びますが、exim4はこれらの扱いに丁度いいのです。

 人様にお見せできるレベルの虎の巻は簡単に書けませんが、将来の自分向けたマニュアルを書いておくことは有益だと思います。

#サーバー

■思ってみた

陽が伸びて暑さを感じるようになってきました。

編集

■全文検索:

複合検索窓に切り替える

■複合検索:

  • 投稿者名:
  • 投稿年月:
  • #タグ:
  • カテゴリ:
  • 出力順序:

■日付検索:

■カレンダー:

2023年1月
1234567
891011121314
15161718192021
22232425262728
293031

■カテゴリ:

■最近の投稿:

最終更新日時:
2026年7月17日(金) 17時46分49秒