駄目社員はむの日記

USO800 certified.

Raspberry Pi Zero で、世事に聡くなる (4)

BBCRSSを取得するプログラム

bbcrssget.pyとした。

import feedparser
import pprint

url = "http://feeds.bbci.co.uk/news/world/rss.xml"
f = feedparser.parse(url)

for article in f['entries']:
   print(article['title'])
   print(article['summary'])
   print('\n')

このまま使うことにした。

python bbcrssget.py > ./bbcnews.txt

こんなかんじで、RSSからテキストを出力できる。

テキストをキャラクタ液晶に表示するPythonコード(適当)

以前Raspberry Pi Picoに似たようなプログラムを書いていたので、それをちょいちょいして作る。
MicropythonからPythonの移植はとても楽だ。bbcrssshow.pyとする。

import RPi.GPIO as GPIO
import time
from RPLCD import CharLCD

lcd = CharLCD(pin_rs = 17, pin_rw = None, pin_e = 18, pins_data = [25,24,23,22],
 numbering_mode = GPIO.BCM, cols=8, rows=2, dotsize=8)

with open('bbcnewsrss_today.txt','r') as file1:
    for line in file1:
        data_lines = file1.read()
        for word in data_lines.split(" "):
            lcd.write_string(word[:16])
            time.sleep(1.0)
            lcd.clear()

これが基本である。
RSSからfeedparserで切り出したテキスト(bbcnewsrss_today.txt)を読み込んで、単語にスプリットして格納し、1秒ごとに16文字ずつキャラクタ液晶に送り込んでいる。

上記ソースだと、1ワードずつ液晶に表示されるはずだ。

これだと昔のルパンのサブタイトルを想起させる。間違ってもここで、Zeroにブザーを繋ぎ、ニュース1件ごとに「あのタイプライター音とBGM」を演奏させる方向にしてはいけない。それでは、イロモノガジェットに転落である。
あとはキャラクタ液晶の文字数に合わせて、複数ワードを上手に表示するよう工夫するだけである。うちの場合は、if分岐とlenで文字数カウントでごにょごにょして、16x1文字に収まるよう調整した。
#その辺は、長ったらしいだけなので書かない。


なおキャラクタ液晶は、スクロール表示させると視認性が地獄なのでやめといたほうがいいぞ・・・(経験者)

そろそろ、"Putting all together"だ。

シェルスクリプトbbcrssnewsを作る。

#!/bin/sh
python bbcrssget.py > ./bbcnewsrss_today.txt
echo bbcnewsrss_today created.
python bbcrssshow.py

と記載し、./bbcrssnewsを実行してやれば、

RSSから取得されたニュースがキャラクタ液晶に表示されるはずだ。*1


これで、おいらもいよいよ情報通だね?(せやろか)
(あとちょっとつづく)

*1:中身のある一文を表示させるなら、20文字 x 4行とか文字数多い液晶が魅力的だ。なお、検討中ちょい試してみたのだが、画面がでかくうっとうしいので善し悪しだった。小窓に表示されるほうが邪魔くさくなくていいと感じた。

今日という日。

朝。

7時少し前起床。

  • はい、というわけで静かな三連休でした。
  • 昨夜の夢:朝家から車を出そうとしたら車がなくていきなり途方に暮れる。おうちに帰ってくるとイタリア系のおっさんがたがゾロゾロアパートの室内に入り物色している。あんたら身なり良さそうなのに何なんだよと冷静に考えている僕。

午前中。

定時ザイタック開始。

昼。

居酒屋ランチを食う。ちょいしょっぱいけど、ご飯が少ないのはオッサンにちょうどいいんだぜ。
そしてトンカツがトンカツしている。薄切り肉に衣を盛って盛って揚げた様な、松*やのとんかつとは違うのだ。

午後。

風強い。しかし三連休良く休んで体調が持ち直したのをすごく感じる。
稲葉山帰城を強行せず、休んで正解だったといえる。

よる。

19時過ぎ横になる。
まだ体調回復とはいかないもんだな。

Raspberry Pi Zero で、世事に聡くなる (3)

目的に立ち返る:「世事」をどう手に入れる?

「世事に聡くなる」ためには、まともなソースをもとにした情報が表示されなければなるまい。
問題は、ニュースソースとその入手法だ。


少し思案した結果、古典的なRSSを使うことにし、xmlソースから枝葉末節を削って表示することにした。
RSSは滅びゆく存在だが、ありがたいことにBBCやCBNなどがまだ提供している。
ご参考:RSS feed lists available on the Internet
RSS Feeds | CBN.com
BBC News - News feeds from the BBC


そこで、BBC World Newsから引っ張ることにした。
https://feeds.bbci.co.uk/news/world/rss.xml
#昨今だと、X(旧twitter)から引っこ抜くのも、一興だろう。

RSSを引っ張ってくるPythonのライブラリ。

Pythonにはなんでもライブラリがある。ありがてぇ。
RSSを活用するライブラリとしては、feedparserというのが定番らしい。
これも管理者権限で、

pip install feedparser

しちゃおう。
ご参考:【Python】feedparserでRSSフィード解析 | amateur engineer's blog
Pythonを使ってお気に入りサイトのRSSを取得する①|ノンストップ飯田

こちらも素振り。

ノンストップ飯田様のサイトに記載のソースを少しいじるだけで、必要なニュース部分は切り出せそうだ(勉強になります)。

import feedparser
import pprint

url = "http://feeds.bbci.co.uk/news/world/rss.xml"
f = feedparser.parse(url)

for article in f['entries']:
   print(article['title'])
   print(article['summary'])
   print('\n')

出力(抜粋)は以下。

Trump defeats Haley in South Carolina primary - US media
The former president continues his march towards the Republican nomination with a projected win in his rival's home state.


US and UK carry out new strikes on Yemen's Houthis
The US says the allies targeted 18 sites, including missile storages, drones and radars.

すご。
軽々とタイトル・本文がテキストに吐き出されやがりましたよ。
キャラクタ液晶に表示するに相応しい、簡潔なテキストができました。


世事に聡くなるまで、あと数歩。
(つづく)

Raspberry Pi Zero で、世事に聡くなる (2)

キャラクタ液晶→Humble Pi→Raspberry Piのワイヤリング

キャラクタ液晶はいわゆる「HD44780互換」というありがちなものなので、きっと先達がPythonライブラリを作ってくれるだろうから、そっちは後回しにして、まずハードを繋ごう。

Humble PiはGPIOを番号順に並べてくれているのでとてもありがたい。

LCD 16pin 26pin Pi Zero ヘッダー コメント
VSS 1 6 GND
VDD 2 2 +5V 10kΩ半固定抵抗入力
Vo 3 - NC 10kΩ 半固定抵抗センター
Rs 4 11 GPIO17
R/W 5 - NC LCD 1pinにジャンパー、半固定抵抗GND
Enable 6 12 GPIO18
DB0 7 - NC
DB1 8 - NC
DB2 9 - NC
DB3 10 - NC
DB4 11 22 GPIO25
DB5 12 18 GPIO24
DB6 13 16 GPIO23
DB7 14 15 GPIO22


こんな感じ。間違っていても保証しません。
ドーターボード側で並んでいるヘッダにハンダ付けしやすいようにつないだだけなので、GPIOは適当に選んでください。
I2C接続であれば配線はもっとスマートだが、格安100円液晶だし、信号線はじゅうぶんZeroから出ているので、まあよし!

続いて、Pythonのライブラリをインストール。

キャラクタ液晶は、定石通り、Pythonで触るのがいいだろう。
キャラクタ液晶の制御ライブラリはAdafruitからも出ているらしいが、HD44780互換フルサポートで、パラレル(GPIO)とI2C両方に対応したRPLCDを選択。

素振り。

実は紆余曲折あったのだが、それはそれとして、

import RPi.GPIO as GPIO
import time
from RPLCD import CharLCD

lcd = CharLCD(pin_rs = 17, pin_rw = None, pin_e = 18, pins_data = [25,24,23,22], numbering_mode = GPIO.BCM, cols=8, rows=2, dotsize=8)
lcd.clear()
lcd.write_string("dame shain")

てな具合で書けば、まずはテキストが表示されることが分かった。

lcd = CharLCD(pin_rs = 17, pin_rw = None, pin_e = 18, pins_data = [25,24,23,22], numbering_mode = GPIO.BCM, cols=8, rows=2, dotsize=8)

は、GPIO.BCM(GPIO番号で記述する方法)と、GPIO.BOARD(ヘッダの番号で記述)のどちらでもいいみたい。
16文字x1行の液晶は、中身が8文字x2行なので、そのように記載。
(つづく)

今日という日。

朝。

7時半起床。
ヒキコモリ三連休最終日、天気予報通り雨だな。

午前中。

謎工作にハンダゴテとコーディング。

午後。

少し元気でてきた。
痰が黄色くなくなってきたぞ。
微妙な天気の中関大前付近へ。寒い。
この上なく「寒空の下」というフレーズが似合う今日、大阪マラソンとか冗談だろ。
#こんな日ならマラソンじゃなくたって脚つりそうだよ。

夕方。

年度末のフリーダイビングがますます増える季節。今日も山手線が止まっているという。
フリーダイバーは極私的な自由を求めるが、膨大な人間を不自由に陥れる。なんてクソ野郎だ。

夜。

カレー脳に敗北。
ご飯を炊き、ハウスのレトルトカレーに興じる。
そして書籍の電子化しているうちに、無念のインドア三連休は終わるのだった。

Raspberry Pi Zero で、世事に聡くなる (1)

はじめに:Raspberry Pi Zero WHが余っちまった。

先日読書サーバ用に使ってきたPi Zero初代が引退を迎えたのだが、そのままジャンク箱行きはちょっともったいなくなった。
そうだ、電光表示板として余生を送ってもらおう。
古いSDカードを挿し、とりあえずsshで外からいじれるようにしといた。


これを使って、世間のニュースを表示するガジェットを作ることにした。
きっとこれがあれば、世事に疎いとは言わせない(なぞ)

材料を漁る。

  • 基板 - シリコンハウスでジャンクとして@100円で出ていた謎ドーターボードHumble Pi。
  • キャラクタ液晶 - これまたデジットで@100円で売られていた16文字 x 1行で、I2C駆動じゃないタイプ。8線で配線する必要がある。
  • 配線 - フラットケーブル少々。

こんなもん。あとはなんとかなるはずだ。

Humble Piという基板(Ciesco社製?)

というのは、どうやらRaspi初代用エクスパンションボードであるらしい。メイン基板、あと26ピン(13x2)のピンソケットが付属している。
初代ラズパイにぴったしな形状をしており、ラズパイのピンヘッダに挿すことでユニバ基板にGPIOなどを引っ張り出せる。そんなわけで、Zeroとはサイズがまるで合わないのだけれど、ラズパイのGPIOピンマッピングは初代からほとんど変わっていないので、遠い親戚のZeroでも電子工作するにも十分役立てるはずだ。
こんなやつ:https://www.farnell.com/datasheets/1684004.pdf


世事に聡くなるには大分遠そうだ。
(つづく)