ArduinoでDMXを受ける

DMXSerial使っただけ。この方法だとHardwareSerialを使うので、スケッチ書き込み時にTX,RXからピンを抜いておかないと書き込みエラーが出たりするので、組み込みで半田付けしてからスケッチ修正できない。ムムム

f:id:MagmaChocolate:20180105190616p:plain

https://qiita.com/loveandsheep/items/e1295ec9ce589 ...

DMXプロトコルをまとめる

DMX512-A仕様

  • シールド付きツイストペアケーブルを使用すること
  • RS-485では1500mまでの通信が保証されているが、RS-485の仕様の中でケーブルの長さを伸ばすと通信速度が下がるとされているので、DMX512-Aの通信速度250kbpsが保証されるのはケーブル長400mまでとされている。
  • RS-485の仕様では1Masterで32Slaveまでとされている
  • DMX512-Aのボーレートは250kpbsなので、1bitあたり4μsec (※1)
  • 端末にはターミネータ(終端抵抗)をつけるDMX512-Aでは基本的に120Ωとなっている(100-120)と幅を効かせて定義もされている。
  • 仕様上では1パケット長が最小で22.7msecになり、リフレッシュレートは最大で44Hzになる

※1: 仕様では基本250kbpsとしているが245 ≤ n ≤ 255kbpsまで認めているので、1bitは3.92 ≤ n ≤ 4.08µsecまでと幅がある。

パケット仕様

パケットは以下のフレームで構成されている。

http://www.iar.unicamp.br/lab/luz/ld/C%EAnica/Manuais/dmx_usit.pdf

f:id:MagmaChocolate:20180102234649p:plain f:id:MagmaChocolate:20180102234658p:plain

No. Frame Long Info
1 "SPACE" for Break 88µsec 1sec ※1 LOW
2 "MARK" After Break (MAB) 8µsec≤n<1sec HIGH
3 START Bit 1bit (4µsec) LOW
4 SLOT nnn Data 8bit (32µsec) (0~512 SLOT)
5 STOP Bit 2bit (8µsec) HIGH
6 "MARK" Time Between slots 0sec≤n<1sec HIGH
7 "MARK" Before Break (MBB) 0sec≤n<1sec HIGH

3~6を513回繰り返します。

※1:仕様では88µsec以上としか書かれていないが、パケット全体を1sec以内に収めることが書かれているので、事実上制限があることになりそう?

この調子で1パケットで513 SLOTのDataを送信します、このDataを仕様内ではSLOTと呼び、最初の0SLOTはSTART CODEで1SLOTがDMXの1ch,2SLOTが2ch...

START CODE

DMX512-Aでは調光信号の他、イロイロな信号を流せるようになった、この時にこのStart bitに仕様で定義されているコードを送信することで受信側はなんの信号か判断できるようになっているがこのコードをちゃんと識別しれくれない機器もある。RDM信号流したら安物ムービングがピクピク動くからなんだと思ったら受け取った信号を全て調光信号として受け取る仕様らしく何しても動くやつとかある。 パケットの0 SLOTに以下の通りのコードを送信すればいいらしい。

NAME CODE
Lighting Data 0x00 (0000 0000)
Network Test 0x55 (0101 0101)
Text Packet 0x17 (0001 0111)
Remote Device Management 0xCC (1100 1100)
System Information Packet 0xCF (1100 1111)
Dimmer Curve Select 0xFF (1111 1111)

ArduinoでDMX送信

格安ArudinoでDMXを送信する

部品

配線

f:id:MagmaChocolate:20180101214426p:plain

スケッチ

DmxSimpleをとりあえず書き込んでサンプルを動かしてみた。 このライブラリデフォルトのPinアサインは上の図の通りだが、コード内で別途指定すれば変更できるっぽい。

SerialToDmxはPCからのシリアル画面から{ch番号}c{ゲージ}wって感じで送ってやれば送信できる、5chに255を出力すると5c255wと送信すればいいらしい。

FadeUpはPinアサインがデフォルトから変更されているので、

// DmxSimple.usePin(3);

しとけばとりあえず動いた。

NetlifyとGithubで独自ドメインのサイトをHTTPS化したメモ

事の発端

IOS 11キタ━(゚∀゚)━!  Safariからカメラの映像が取得できる! これでアプリではなくブラウザからARできるようになった!と喜んでいたら、このカメラのapihttpsじゃないとセキュリティ的な問題で動かないのである。

Github pagesで独自ドメインホスティングしているサイトをHTTPSにしたいけどお金はない。

すでに導入レポは検索すればいくつも見つかるものの、どうも日本語の情報が少ないのでメモすることにした。

使ったもの

  • Github
  • Netlify
  • お名前.com

手順

  1. お名前.comでドメインを取得します。
  2. Githubに公開するサイトのファイル一式をpushしておきます。

    一度Github pagesで公開してみて問題がないことを確認しておきましょう。設定で有効化して、HTTPSにチェックを入れればhttps://<username>.github.io/<repository name>/でアクセスできます。

  3. Netlifyに登録します。

    www.netlify.com Githubアカウントでログインし、先ほどpushしたリポジトリを選択し、デプロイしましょう。

  4. Netlifyのsite nameを変更しましょう

    デプロイをするとデフォルトでランダムな英単語が割り当てられるので、変更しなくても問題はないが変更しておきましょう。

    General -> Setting -> Site details -> Change site name から設定します。 f:id:MagmaChocolate:20171015014625p:plain

  5. カスタムドメインを設定しましょう

    Domain management -> Domains -> Custom domain に取得しておいたドメインを設定します。 ここで、Netlifyはwww付きのドメインにすることを勧めてきます。DoS攻撃から守りやすいとか、ロードが早いとか色々恩恵があるらしいのですが、それよりもURLが短くなる方がいいなって思ったので、自分はwwwなしにしました。 f:id:MagmaChocolate:20171015015607p:plain

    設定後、NetlifyのDNSを利用するので Use Netlify DNS を押します。4つURLが表示されると思います。これは次の作業で使うので覚えときましょう。

  6. ドメインの設定をしましょう

    今度はお名前.comでドメインの設定をしていきます。

    ログイン後、ネームサーバーの設定 -> DNS関連機能の設定 にAレコードとCNAMEを追加します。

    • Aレコードで 104.198.14.52を追加します。
    • CNAMEにwwwをつけてNetlifyで設定したURLを追加します。<site name>.netlify.comです

    f:id:MagmaChocolate:20171015021014p:plain

    次に、DNSを変更します。

    ネームサーバーの設定 -> ネームサーバーの変更 -> 他社のネームサーバーを利用 に4でNetlifyにドメインを設定した時に出てきた4つのDNSのURLを設定します。人によってこのURLは異なるみたいです。

    f:id:MagmaChocolate:20171015021555p:plain

    設定が反映されると、独自ドメインにアクセスするとHPが表示されると思います。このままではまだHTTPです。いよいよ次でHTTPSになります。

  7. NetlifyでSSLを有効化しましょう

    Netlifyで Domain management -> Domains -> HTTPS -> SSL/TLS certificateVerify DNS configrationをクリックしLet's Encypt certificateをクリックです。

    f:id:MagmaChocolate:20171015022037p:plain

    お疲れ様でした、試しにhttps://でアクセスしてみましょう、表示されれば成功です。セキュリティーがどーたらと表示されてしまう場合はしばらく待ってれば反映されるっぽいです。

    最後の仕上げとして、httpでアクセスがあった時にhttpsにリダイレクトさせたいので Force TLS connectionsを有効化して完了です。そんなの表示されてないよって時はリロードするとたぶん出てきます。

    f:id:MagmaChocolate:20171015023118p:plain

コメント

ドメイン周りの設定は順番が大切なので、3回ぐらい失敗してサイトを消してやり直してを繰り返してしまった。勉強不足だ。 そんなこんなで、準備は整ったので、AR.jsとやらに挑戦します。

Arduino互換品のドライバーメモ

買ったやつ

Amazon CAPTCHA

インストールしたドライバー

CH341SER_MAC.ZIP下载页面-江苏沁恒股份有限公司

安価でDMX機器をPCでコントロールしたかった

DMX機器を何種類か導入したはいいものの、卓がなかったり、単純にオペレータが不足してたりするので、PCで一括制御したくなったので作った。

ネットを検索しているとArudinoやラズパイを使いPCからDMX信号を出力しているものをいくつか見つけたが、たかがDMXにはオーバースペックだなぁとか、思ってたら、安上がりの記事を見つけたので実際に作ってみる。

https://stevenbreuls.com/2013/05/diy-usb-dmx-dongle-interface-for-under-10/

この記事にしたがって作っていけば困ることはなかった。何個か作っているうちに一番手頃に手に入ると思った材料を紹介します。

Amazonで購入したシリアルコンバーターですが、中国から直送されるため注文から1~2週間かかり、関税通過のために真っ黄色のプチプチ付き封筒で届きます。 これを使えば、元の記事にあるようにICの足を結線しなくても問題なく動作しました。触ってないのにたまにLEDパーが一瞬だけついたりしてたので、末端抵抗をつけたら大丈夫になりました。

Dockerで立ち上げたwebサーバでmod_rewriteしたかった話

内容

DockerHubの公式のPHPイメージを使っていて、mod_rewiteしたい人向けのお話です。結論だけ知りたい人は読み飛ばしてね。

事の発端

僕自身が立ち上げたwebサービスではもともとURLがhttp://example.com/index.php?cmd=view&page=123という感じでとてもダサかったので、かっこよくしたかった。WordPressなどではパーマリンクと呼ばれURLがイカした感じになっているので、僕も方法をパクった。 調べるとapache側の設定でmod_rewriteを使うとアクセス時にURLを記述したルールに基づいて置換してくれるらしい。

僕のwebサービスではアクセスを全てindex.phpで受け、getパラメータで動作を変化させている、pukiwikiとか?の設計をパクったはず。動作ルールは以下

example.com/index.php?cmd=[動作モード]&page=[記事のNo.]

  • cmd
    • view 記事の表示、pageで記事を指定
    • edit 記事の編集、pageで記事を指定
    • category カテゴリーごとに記事一覧を表示する  などなど

これをexample.com/[動作モード]/[記事のNo.]にしたかった。 さらにviewの時にはexample.com/[記事のNo.]にしたい。

このルールでURLを置換させるには.htaccess

RewriteEngine On
RewriteBase /
RewriteRule ^([0-9]+) index.php?cmd=view&page=$1 [L]
RewriteRule ^edit/([0-9]+) index.php?cmd=edit&page=$1 [L]
RewriteRule ^edit index.php?cmd=edit [L]
RewriteRule ^category index.php?cmd=category [L]

のように記述する、よくある正規表現と似ているので特に迷うことはないだろう。

いざ、Dockerで立てた開発環境に置いてみると、500エラー。なんで!! しばらく悩むも解決せず、諦めて本番環境に置いてみると動いた!なんで!!

理由は単純だった、使っているシステムが違った。どちらもapacheなのは違いないが、本番はCentOSで構成されており、開発環境のDockerの公式imageのphpdebianで構成されていた。

github.com

debian系のapachemod_rewriteを有効化するにはコンテナに入ってコマンドを打てばいいらしい。

$ docker exec -it {php_container_name} bash
$ a2enmod rewrite

そして/etc/apache2/sites-available/000-default.confのの中に

    <Directory /var/www/html>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Require all granted
    </Directory>

を追加して再起動すればOK!

でも、せっかくdocker-compose使ってるからいちいちコマンド打つの面倒だよね。ってことで

結論

Dockerfile

FROM php:7.0-apache
RUN  a2enmod rewrite

docker-compse.yml

php-7.0:
  build: .
  ports:
    - "80:80"
  volumes:
    - "../:/var/www/html"
    - "./000-default.conf:/etc/apache2/sites-available/000-default.conf"

000-default.conf

<VirtualHost *:80>
    <Directory /var/www/html>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Require all granted
    </Directory>
~~~~~~~~~~~~~~以下略~~~~~~~~~~~~~~~~

この3ファイルを同じディレクトリに入れdocker-compose upでOK。

ちなみに、mysqlも使いたいよって人は

Dockerfile

FROM php:7.0-apache
RUN apt-get update && \
  docker-php-ext-install pdo_mysql mysqli mbstring && \
  a2enmod rewrite

こうすれば良いです。