読者です 読者をやめる 読者になる 読者になる

bringartmのブログ

忘れそうなことを記録にのこそうと。

久しぶりに鉄道模型を出して、楽しみました。

鉄道模型


久しぶりに鉄道模型を出して、楽しみました。

まずは、線路の掃除から・・・。 レールを磨いた後、クリーニング車にて、一通りの走行確認をしました。

ホームを設置すると、ジオラマが一気に盛り上がります。

模型の全景、上からの写真。

車両基地、5つの引き込み線があります。そのポイントコントロールのスイッチです。

最初にジオラマを作ったときは このあたりに線路がありました。もうすこし改造をしたいと思っています。

ジオラマの電源供給やポイントコントロールは、取り外し可能なコネクタでつないでいます。

4つの線路の供給を3つのパワーバックでコントロールしています。そのための、供給スイッチです。

早押しボタンに司会者用コントロールを追加。プログラム作成。

IchigoJam

Ichigojamの基板に7セグLEDを表示する回路基板を乗っけて、拡張性のあるインターフェイスができましたので、早押しボタンで回答者を一桁の数字を表示する仕組みにしました。

IN1,IN2,IN3,IN4,OUT1,OUT2,OUT3 (IN4~7に設定) で 回答者4名と出題者1名のボタンを制御しています。

f:id:bringartm:20170221195619j:plain
プログラムは下記の通り。 
(注)行内の空白や、注釈は説明用に付与をしました。 そのためプログラム入力するときには削除してください。そうしないとプログラム制限を超えメモリーオーバーになります。

100 '20170219 HC595 7SEG
110 cls: clv: OUT1,-1: OUT2,-1: OUT3,-1  'OUTの-1設定でINに変更
120 LET [90],63,6,91,79,102,109,125,39,127,111 '[90]からの10個配列で、7SEGの表示を設定
130 @INIT
140 P=0:GSB @SEG_DISP
150 @PRE
160 ifIN(7)<>0thenWAIT1:GOTO@PRE '7:司会者「出題」ボタン
170 Q=IN()&15 ’出題ボタンを押したときにフライング者を特定 Q:4ビットの押下状態を記憶
180 H=80:LET[80],0,0,0,0 :K=80:G=0 '[80]からの4個配列で、回答先着順を記憶 H;回答配列添え字 K:回答権番号
190 PLAY "T260 <G8B8": WAIT30 '出題のジングル
200 GSB @SEG_OFF ’出題中を表す、ドットのみの表示
210 @Thinking
220 B=in()
230 if B&(112+Q)=(112+Q) then GOTO @Thinking 'B: IN配列、今回7つ分を判断するため127(112+15)でモニタ繰り返し Q:4ビットで回答権がないものとマスクして 有効なキーが押されたとき次の行へ遷移
240 'SENCE 
250 forI=1to7: if B>>(I-1)&1 = 0 then P=I 'P: 回答者を特定
260 next
270 ifP>4then GOTO@CTRL 'P:5 正解 6: 不正解/次点 7:リセット
280 Q = Q&(15-1<<(P-1)): [H]=P :if[H-1]=[H] goto @Thinking else H=H+1 'Q:回答権は一人一回 H:回答配列
290 ? "Touch No = ",[80],[81],[82],[83]
300 if G=0 then F=[K] :GSB390:PLAY "T260 O5C8":G=1 ’音を出すのは一回だけ F:7SEGの表示数字
310 goto @Thinking
320 @CTRL
330 if P=5 then PLAY "T260 O5GCGCGC": goto@INIT
340 if P=6 then PLAY "T260 EEE": K=K+1: G=0: WAIT20 ’K:回答順位 
350 if P=7 then K=84 ’K:84 回答順位は80~83のため閾値を84とする
360 F=[K]:if K=84 then GOTO @INIT
370 GSB @SEG_DISP : goto @Thinking
380 '---SUB-RATCH---
390 @SEG_DISP  ’[90]から[99]までのLEDの表示数字構成からビットごとに操作
400 OUT5,0:FORS=7TO0STEP-1:OUT4,0:OUT6,[F+90]>>S&1:OUT4,1:NEXT:OUT5,1
410 RTN 
420 @SEG_OFF 'ドットのみ表示
430 OUT5,0:OUT4,0:OUT6,1:OUT4,1:FORS=7TO1STEP-1:OUT4,0:OUT6,0:OUT4,1:NEXT:OUT5,1
440 RTN

Ichigojamのインターフェース基盤を作りました。

IchigoJam

こちらのIchigoJamは、楽しくIn/Outの制御ができるとっても素敵な、ワンボード。

74HC595汎用ICを使って、OUT4,OUT5,OUT6からの信号を受けて、7SEGのLEDを制御します。またシフトオーバーフローを利用して別の74HC595につないで ラッチを拡張する端子も付けました。

外部の接続は、USBシリアルの基板を直接させるようにしたコネクタに、TX RX +5 GNDを IchigoJamの基板にケーブルで接続しています。 こうすれば、すっきりと実験ができます。

自動起動用に BTNをスイッチでGNDとつなげるようにしていて、パソコンやキーボードを接続しないでも単独で動作できるようにしています。
基盤が同じ大きさなので、スペーサーで2段組みをしています。

In1~In7までの入力ピンと プルアップしたボタンをつないで、早押しゲームの審判機器を作成しました。

IchigoJam ファームアップデートしてみました。

IchigoJam

Ichigojamのファームアップデートをやってみました。
接続の仕方や必要なファイル、手順は、IchigoJamのファームを書き換える - コンピュータを楽しもう!に書いていただいている方法で分かりやすくできました。ありがとうございます。

今回手元に、USBシリアル接続のグッズがあったので、簡単でした。
Ichigojamの電源を入れる前に、下記の通りジャンパー線で接続し、電源をいれたら RESET --- GND を外すという手順です。

USBシリアル  IchigoJam
   TxD   -----   RxD
   RxD   -----   TxD
   GND   -----   GND (CN5 5番)
   +5V   -----   +5V (CN5 1番)

          ISP ----- GND
          RESET --- GND


ファームデータは、
ichigojam.net
こちらの最新版 IchigoJam ver 1.2.1 をダウンロードして、解凍しておきました。

書き込み用のツールもダウンロードして起動。 画面の項目は 下記のようにしました。
最初 エラーになってしまい 再確認したところ、 Eraseのチェックボックスを チェックし忘れていました。

f:id:bringartm:20170218070326p:plain


対象のHEXが どのファイルを選べばよかったのかわからず、悩みましたが、
.hex ファイル名 ichigojam-xtai.hex
言語 日本語・英語
キーボード 日本語 JIS
外部クリスタル 自動判別
出力 (+シリアル) ビデオ信号
というので良いとのことなので、それを選択しました。

完了まで全体で10分ぐらいでした。

74HC595でラッチの実験

IchigoJam

8本のLEDを基盤にはんだ付けして スイッチの実験をしています。

74hc595は 3つの信号から 簡単にビットの制御を通して 個別にLEDをつけたり消したりできます。3つの信号はichigojamから取り出し入力へ、出力をLEDに8本分へ接続してみました。

f:id:bringartm:20170122160000j:image

Twitterへの画像投稿プログラム(python)

Raspberry Pi

RaspberryPiで自動投稿をしてみたくなり、カメラ画像などができないかなあと考えています。

まずは Twitterで投稿するプログラムを改良してみました。

CK, CS, AT, AS には Twitterから取得した各種のコードIDを記入してください。

#!/usr/bin/env python
# coding: utf-8

import json
from requests_oauthlib import OAuth1Session

CK = '' # Consumer Key
CS = '' # Consumer Secret
AT = '' # Access Token
AS = '' # Accesss Token Secert

url_media = "https://upload.twitter.com/1.1/media/upload.json"
url_text = "https://api.twitter.com/1.1/statuses/update.json"

# OAuth認証 セッションを開始
twitter = OAuth1Session(CK, CS, AT, AS)

# 画像投稿
files = {"media" : open('image.jpg', 'rb')}
req_media = twitter.post(url_media, files = files)

# レスポンスを確認
if req_media.status_code != 200:
    print ("画像アップデート失敗: %s", req_media.text)
    exit()

# Media ID を取得
media_id = json.loads(req_media.text)['media_id']
print ("Media ID: %d" % media_id)

# Media ID を付加してテキストを投稿
params = {'status': '画像投稿テスト', "media_ids": [media_id]}
req_media = twitter.post(url_text, params = params)

# 再びレスポンスを確認
if req_media.status_code != 200:
    print ("テキストアップデート失敗: %s", req_text.text)
    exit()

print ("OK")

メモ引用 Twitterタイムラインを監視する

Raspberry Pi

http://nwpct1.hatenablog.com/entry/2013/10/17/233339

タイムラインを監視する

これについては調べると↓の記事がとても参考になりました。
?tweepyがUser Streamsに対応していた

この記事に載っているタイムラインを監視するpythonのプログラムがとても綺麗に書かれていたので,とても読みやすかったです。タイムラインの取得はこのページのプログラムで解決しました。本当に感謝です。 上記のページに乗っていたプログラム↓を実行させてもらいます。

#!/usr/bin/env python
#-*- coding:utf-8 -*-

from tweepy.streaming import StreamListener, Stream
from tweepy.auth import OAuthHandler
from tweepy.api import API
from datetime import timedelta

def get_oauth():
    # 以下4つのキー等は適宜取得して置き換えてください。
    consumer_key = 'XXXXXXXXXXXXXXXXXXXXXX'
    consumer_secret = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
    access_key = 'xxxxxxx-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
    access_secret = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
    auth = OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_key, access_secret)
    return auth

class AbstractedlyListener(StreamListener):
    """ Let's stare abstractedly at the User Streams ! """
    def on_status(self, status):
        # Ubuntuの時は気づかなかったんだけど、Windowsで動作確認してたら
        # created_atはUTC(世界標準時)で返ってくるので日本時間にするために9時間プラスする。
        status.created_at += timedelta(hours=9)
        print(u"{text}".format(text=status.text))
        print(u"{name}({screen}) {created} via {src}\n".format(
            name=status.author.name, screen=status.author.screen_name,
            created=status.created_at, src=status.source))

if __name__ == '__main__':
    auth = get_oauth()
    stream = Stream(auth, AbstractedlyListener(), secure=True)
    stream.userstream()