I2C 16×2 LCDで日本語(カタカナ)を表示する(pythonプログラムあり)

LCDでカタカナ表示

こんにちは。ラズパイやArduinoでセンサ等を利用していると、気温などの数値をどうやって表示するか意外に悩みます。そんなメッセージや数字を表示したい時に便利なのがLCDディスプレイです。LCDは電光掲示板のようにドットで表現された文字を表示するデバイスで、ラズパイの5V電源でも動かすことが出来ます。

Osoyoo製LCD。電子工作入門セットに入っていました。

上の電子工作入門セットに入っていたOsoyoo製LCDは、I2Cで簡単にラズパイと接続できて、さらに制御用pythonプログラムも公式で公開されているのでとっても簡単にメッセージが表示できる…、のですがこの制御プログラム、英数字の出力のみでカタカナの表示方法が全く説明されていません。ドキュメントは日本語なのに不親切極まりないです。(初心者向けセットなのにマニュアル等一切なし。せめて各文字に対応するアドレスだけでも公開して欲しい…)

というわけで今回はこれにカタカナや記号を表示させることを目標にしたいと思います。

(追記)
このLCDの裏にはんだ付けされているI2C接続用マイコン「HD44780」は有名らしく、こちらで検索するとわりとヒットしました。今回はOsoyooのプログラムをもとにpythonで操作する方法をご紹介します。

このICは広く利用されているようで、説明されているページも多くありました。

表示は出来るっぽい

Osoyooの公式ページに従って進めてみます。

とりあえずドキュメントに従ってLCD制御用pythonプログラムをダウンロードして、文字を表示させてみる。LCDとラズパイの5V、OUT、SDA(#2ピン)、SDL(#3ピン)を接続して、制御プログラムのmain関数の中に次のように書けば英数字は表示できます。

def main():
  lcd_init()
  lcd_string("Hello world!",LCD_LINE_1)

このままだと表示されたメッセージが一瞬で消えてしまうので、一番下の二行をコメントアウトしておきます。

#finally:
  #lcd_byte(0x01,LCD_CMD)

これで英数字は問題ないのですが、カタカナを表示しようとすると文字化けしてしまいます。

対策

かなり強引ですが、文字化けすることを見越して元のテキストを変えてしまう変換表を作ってみました。表示したいテキストを一回この関数で変換した後、上記の方法でとりあえず正しい文字が表示できます。

def katakana(text):
	list1a = u"「。、」ヲ・ィァェゥォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゛゜"
	list1b = u"アァイィウゥエェオォカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミ"
	list2a = u"ガギグゲゴザジズゼゾダヂヅデドバビブベボ"
	list2b = u"ザシジスズセゼソゾタダチヂッツナニヌネノ"
	list3a = u"パピプペポ"
	list3b = u"ナニヌネノ"
	
	text_changed = ""
	for l in text:
		#カタカナを変換
		if list1a.find(l) >= 0:
			text_changed += list1b[list1a.find(l)]
		#濁音を清音+濁点に
		elif list2a.find(l) >= 0:
			text_changed += list2b[list2a.find(l)]
			text_changed += u"マ"
		#半濁音を清音+半濁点に
		elif list3a.find(l) >= 0:
			text_changed += list3b[list3a.find(l)]
			text_changed += u"ミ"
		#その他の文字はそのままにする
		else:
			text_changed += l
	
	return text_changed
def main():
  lcd_init()
  text = u"ラズベリーパイ"
 text2 = katakana(text)
  lcd_string(text2,LCD_LINE_1)

対策②

上の方法は対処療法であまりよろしくないので、いっそ表示出来る文字を全て調べてみました。制御プログラムを見たところによると、文字の表示は「0x80 0x##」を送ることで出来るみたいです。「##」の部分に対応する文字を全て表示させてみた結果はこのようになりました。

ほぼShift-JISっぽいが少し違う所も…

どうしてもPCで出せなかった文字は説明にしてあります。英数字やカタカナはShift-JISに沿っていますが、「千」「万」「円」「√」などの文字もあります。これだけあれば色んな情報が表示出来そうですね。個人的には「℃」が使いたいのですが、「゜」「C」で表示出来そうです。

これらの文字を出すにはmain関数内に次のように書きます。

def main():
  lcd_init()
  
  #何行目に表示するか指定
  lcd_byte(LCD_LINE_1,LCD_CMD)
  
  #0xFC=「円」を表示
 lcd_byte(0xFC,LCD_CHR)

「円」を表示することができたでしょうか?
これだと一文字しか表示できず、また毎回表を見るのも面倒なので文字コードの順に並べたリストを作ってみました。文字コードnの文字がn番目に出てくるようにしてあります。これでカタカナを含む文字列を上の表の文字コードに変換して表示出来ます。

2019/11/3追記: 表示される文字のリストcodesの0x27のシングルクォーテーションが抜けていましたので修正しました。

def lcd_string_kana(message,line):
	#文字コードnの文字 = n番目の文字
	codes = u'線線線線線線線線線線線線線線線線                !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}→←                                 。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゛゜αäβεμσρq√陰ι×¢£nöpqθ∞ΩüΣπxν千万円÷ 塗'
	#変換する文字の辞書(ex.「バ」=「ハ」「゛」)
	dic ={u'ガ':u'カ゛',u'ギ':u'キ゛',u'グ':u'ク゛',u'ゲ':u'ケ゛',u'ゴ':u'コ゛',u'ザ':u'サ゛',u'ジ':u'シ゛',u'ズ':u'ス゛',u'ゼ':u'セ゛',u'ゾ':u'ソ゛',u'ダ':u'タ゛',u'ヂ':u'チ゛',u'ヅ':u'ツ゛',u'デ':u'テ゛',u'ド':u'ト゛',u'バ':u'ハ゛',u'ビ':u'ヒ゛',u'ブ':u'フ゛',u'ベ':u'ヘ゛',u'ボ':u'ホ゛',u'パ':u'ハ゜',u'ピ':u'ヒ゜',u'プ':u'フ゜',u'ペ':u'ヘ゜',u'ポ':u'ホ゜',u'℃':u'゜C'}
	message = message.ljust(LCD_WIDTH," ")
	lcd_byte(line, LCD_CMD)
	
	#濁音など、文字の変換
	message2 = ""
	for i in range(LCD_WIDTH):
		if ( message[i] in dic.keys() ):
			message2 += dic[message[i]]
		else:
			message2 += message[i]
	
	#文字コードのリストにある文字なら表示、それ以外は表示しない
	for i in range(LCD_WIDTH):
		if (codes.find(message2[i]) >= 0):
			lcd_byte(codes.find(message2[i])+1,LCD_CHR)
		elif (message2[i] != u' '):
			print "No such character!    :" + message2[i]

ついでに「ガ」などLCDでは二文字で表示する文字を「カ」「゛」に分解する処理も混ぜておきました。

全体のプログラムも載せておきますご参考までにどうぞ。

#coding:utf-8
import smbus
import time
import sys

# Define some device parameters
I2C_ADDR  = 0x3f # I2C device address, if any error, change this address to 0x3f
LCD_WIDTH = 16   # Maximum characters per line

# Define some device constants
LCD_CHR = 1 # Mode - Sending data
LCD_CMD = 0 # Mode - Sending command

LCD_LINE_1 = 0x80 # LCD RAM address for the 1st line
LCD_LINE_2 = 0xC0 # LCD RAM address for the 2nd line
LCD_LINE_3 = 0x94 # LCD RAM address for the 3rd line
LCD_LINE_4 = 0xD4 # LCD RAM address for the 4th line

LCD_BACKLIGHT  = 0x08  # On
#LCD_BACKLIGHT = 0x00  # Off

ENABLE = 0b00000100 # Enable bit

# Timing constants
E_PULSE = 0.0005
E_DELAY = 0.0005

#Open I2C interface
#bus = smbus.SMBus(0)  # Rev 1 Pi uses 0
bus = smbus.SMBus(1) # Rev 2 Pi uses 1

def lcd_init():
  # Initialise display
  lcd_byte(0x33,LCD_CMD) # 110011 Initialise
  lcd_byte(0x32,LCD_CMD) # 110010 Initialise
  lcd_byte(0x06,LCD_CMD) # 000110 Cursor move direction
  lcd_byte(0x0C,LCD_CMD) # 001100 Display On,Cursor Off, Blink Off 
  lcd_byte(0x28,LCD_CMD) # 101000 Data length, number of lines, font size
  lcd_byte(0x01,LCD_CMD) # 000001 Clear display
  time.sleep(E_DELAY)

def lcd_byte(bits, mode):
  # Send byte to data pins
  # bits = the data
  # mode = 1 for data
  #        0 for command

  bits_high = mode | (bits & 0xF0) | LCD_BACKLIGHT
  bits_low = mode | ((bits<<4) & 0xF0) | LCD_BACKLIGHT
  
  # High bits
  bus.write_byte(I2C_ADDR, bits_high)
  lcd_toggle_enable(bits_high)

  # Low bits
  bus.write_byte(I2C_ADDR, bits_low)
  lcd_toggle_enable(bits_low)

def lcd_toggle_enable(bits):
  # Toggle enable
  time.sleep(E_DELAY)
  bus.write_byte(I2C_ADDR, (bits | ENABLE))
  time.sleep(E_PULSE)
  bus.write_byte(I2C_ADDR,(bits & ~ENABLE))
  time.sleep(E_DELAY)

def lcd_string(message,line):
  # Send string to display

  message = message.ljust(LCD_WIDTH," ")

  lcd_byte(line, LCD_CMD)

  for i in range(LCD_WIDTH):
    lcd_byte(ord(message[i]),LCD_CHR)

def lcd_string_kana(message,line):
	#文字コードnの文字 = n番目の文字
	codes = u'線線線線線線線線線線線線線線線線                !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}→←                                 。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゛゜αäβεμσρq√陰ι×¢£nöpqθ∞ΩüΣπxν千万円÷ 塗'
	#変換する文字の辞書(ex.「バ」=「ハ」「゛」)
	dic ={u'ガ':u'カ゛',u'ギ':u'キ゛',u'グ':u'ク゛',u'ゲ':u'ケ゛',u'ゴ':u'コ゛',u'ザ':u'サ゛',u'ジ':u'シ゛',u'ズ':u'ス゛',u'ゼ':u'セ゛',u'ゾ':u'ソ゛',u'ダ':u'タ゛',u'ヂ':u'チ゛',u'ヅ':u'ツ゛',u'デ':u'テ゛',u'ド':u'ト゛',u'バ':u'ハ゛',u'ビ':u'ヒ゛',u'ブ':u'フ゛',u'ベ':u'ヘ゛',u'ボ':u'ホ゛',u'パ':u'ハ゜',u'ピ':u'ヒ゜',u'プ':u'フ゜',u'ペ':u'ヘ゜',u'ポ':u'ホ゜',u'℃':u'゜C'}
	message = message.ljust(LCD_WIDTH," ")
	lcd_byte(line, LCD_CMD)
	
	#濁音など、文字の変換
	message2 = ""
	for i in range(LCD_WIDTH):
		if ( message[i] in dic.keys() ):
			message2 += dic[message[i]]
		else:
			message2 += message[i]
	
	#文字コードのリストにある文字なら表示、それ以外は表示しない
	for i in range(LCD_WIDTH):
		if (codes.find(message2[i]) >= 0):
			lcd_byte(codes.find(message2[i])+1,LCD_CHR)
		elif (message2[i] != u' '):
			print "No such character!    :" + message2[i]

def main():
  # Main program block

  # Initialise display
  lcd_init()
  argv = sys.argv
  argc = len(argv)
  if (argc == 2):
  	lcd_string(katakana(argv[1].decode('utf-8')),LCD_LINE_1)
  elif (argc == 3):
  	lcd_string(katakana(argv[1].decode('utf-8')),LCD_LINE_1)
  	lcd_string(katakana(argv[2].decode('utf-8')),LCD_LINE_2)
  else:
  	#lcd_string(katakana(u"No data."),LCD_LINE_1)
  	lcd_string_kana(u"キオン:∞℃です",LCD_LINE_1)
  	lcd_string_kana(u"チョキン:1千万円",LCD_LINE_2)

if __name__ == '__main__':

  try:
    main()
  except KeyboardInterrupt:
    pass
  #finally:
    #lcd_byte(0x01, LCD_CMD)

カタカナや記号を含めたメッセージを表示することに成功しました!
色々表示させて遊んでみます。

データの表示、ユーザーインターフェースなど色々使えそう

お疲れ様キーボードを作る!

動機

以前Twitterでこんな投稿を見つけました。

「お疲れ様でした」や「ありがとうございます」等の定型文が入力できるキーボードです。
めっちゃ便利そうなので自分で作ってみることにしました!

仕様

とりあえずの構想はこんな感じで行きます

  • キーを押したことをArduino Nanoで認識
  • Arduino NanoからUSB経由でパソコンにデータを送信
  • パソコン側でPythonプログラムがデータを受信
  • プログラムが文字を打ち込む

必要なものと環境

  • 300円デバイス、Arduino Nano
  • ボタンスイッチ
  • Python3.5(3.6以上だと動作しない可能性あり?)
  • Windows 10(ここは何でも構いません)

ボタンとArduino

まず、ボタンを押したことをArduinoで検知する部分を作ります。押すと導通するスイッチとArduinoをはんだ付けでつなぎます。

Arduinoとスイッチ4つを配線

スイッチを押すとD2~D4が0Vに落ちます。

基盤にはんだ付け

Arduino側プログラム

スイッチの0V落ちを検知して、パソコンにデータを送るプログラムを作成します。

const int pin1 = 2;
const int pin2 = 3;
const int pin3 = 4;
const int pin4 = 5;

void setup() {
  Serial.begin(9600);
  pinMode(pin1,INPUT_PULLUP);
  pinMode(pin2,INPUT_PULLUP);
  pinMode(pin3,INPUT_PULLUP);
  pinMode(pin4,INPUT_PULLUP);
}

void loop() {
  int x1,x2,x3,x4;
  x1 = digitalRead(pin1);
  x2 = digitalRead(pin2);
  x3 = digitalRead(pin3);
  x4 = digitalRead(pin4);
  
  if(x1==0) Serial.println(1);
  if(x2==0) Serial.println(2);
  if(x3==0) Serial.println(3);
  if(x4==0) Serial.println(4);
  if(x1*x2*x3*x4!=0) Serial.println(0);
  
  delay(10);
}

スイッチ1~4が押されていれば(電圧が0Vならば)その数字を、すべて押されていなければ(x1~x4がすべて5Vならば)0を送信します。
スイッチが押されていない時(端子に何も接続されていない時)の電圧は、通常は不安定にならないように5Vまたは0Vに接続しなければいけませんがArduinoでは内部的にプルアップまたはプルダウンを選べるようです。

pinMode(pin1,INPUT_PULLUP);

このプログラムだとボタンを押している間ものすごい速さでデータが送信され続けます。一見無駄なようですが、データを受ける側のタイミングが悪いと上手に受け取れなかったりするので、受ける側で対処することにします。

パソコン側Pythonプログラム

最後に、Arduinoからデータを受け取って文字を打ち込むプログラムを作ります。シリアル通信が簡単に書けるPythonを使っていきます。

#coding utf-8
#シリアル通信で受け取ったデータによって
#定型文をエディタにペーストする
import serial
import time
import pyautogui as pa
import pyperclip

def put_text(t):
	tmp = pyperclip.paste()	#今のクリップボードのデータを一時保存しておく
	pyperclip.copy(t)	#テキストをクリップボードに読み込む
	pa.hotkey("ctrl","v")	#”Ctrl+V”を入力
	pyperclip.copy(tmp)	#保存しておいたデータをクリップボードに戻す
	return

def main():
	#通信ポートおよびボーレートの設定
	ser = serial.Serial('COM4',9600)

	while True:
		#データを一行受信
		x = ser.readline()

		#受け取ったデータによって処理を実行
		if (x==b'1\r\n'):
			put_text("お疲れ様です")
		if (x==b'2\r\n'):
			put_text("ありがとうございます")

		#0が送られてくるまで受信のみ
		while (x!=b'0\r\n'):
			x = ser.readline()
	ser.close()

if __name__=="__main__":
	main()

通信ポートの設定の部分はArduinoが接続しているポートに合わせて変えて下さい。(windowsなら「COM◯」、Linuxなら「/dev/ttyUSB0」等)。
pyautoguiやpyperclipなどのライブラリも適宜pipで入れて下さい。僕はpyautoguiがインストール出来ずに割と悩みましたがPython3.5を使うことで解決しました。この辺の原因は謎です。

pip install pyserial
pip install pyautogui
pip install pyperclip

 

エラー処理も何もしていないプログラムなので、参考程度に使用して下さい。

テストしてみる

ArduinoKeyboard.pyを実行しておきます。その状態でスイッチを押すと…

ちゃんと打ててる!

出来ました!

2017/12/26追記:

別の環境で動かそうとしてみたところ、serialパッケージが無いと言われる。pipでインストールしたけど…

pip install serial

エラーが…
serialじゃなくてpyserialらしい

pip uninstall serial
pip install pyserial

これで動いた

 

 

しりとリツイート

しりとリツイートって何?

数多のツイートから無作為にピックアップしてはじめの文字と終わりの文字でしりとりをするツイッターbotです。

現在の機能

  • 毎日午後10時に鍵なしツイートの中からピックアップ
  • ある程度探してしりとりが繋がらなかったらその回は何もしない
  • 「ば」→「は」のような感じで、割とゆるめなルール
  • 様々な文字種に対応(ひらがな、カタカナ、漢字)
  • 末尾のURL、「!」や「?」は無視
  • 名前やプロフィールに「bot」「Bot」「BOT」が入ってる場合は除外

コード紹介

twitterの認証とかはpythonがめちゃ便利なので、pythonで全部書いてしまいました。色々と関数化したら長くなってしまいましたが最後のmain関数が本体です。continueすると以降の処理は飛ばしてfor文の最初まで戻るらしいです。使いようによっては便利ですね。

#coding:utf-8

from requests_oauthlib import OAuth1Session
import json, urllib2
from datetime import datetime
import os
import sys
import time
import re
import TwitterKEYS #twitterのキーを保存しておくファイル
from subprocess import Popen, PIPE

#カタカナ→ひらがなに変換する関数
def henkan(text):
	hiragana=[unichr(i) for i in range(12353,12436)]
	katakana=[unichr(i) for i in range(12449,12532)]
	kana=""
	
	if u'ア' <= text <= u'ワ':
		for text in list(text):
			for i in range(83):
				if text == katakana[i]:
					kana+=hiragana[i]
		return kana
	else:
		return text

#小文字、濁音を変換する関数
def change(text):
	if len(text) == 1:
		n = ord(text)
		#ぁ〜ぉ→あ〜お
		if 0x3041 <= n <= 0x304A and n % 2 == 1:
			text = unichr( n + 1 )
		#が〜ぢ→か〜ち
		elif 0x304C <= n <= 0x3062 and n % 2 == 0:
			text = unichr( n - 1 )
		#っ、づ→つ
		elif 0x3063<= n <= 0x3065:
			text = unichr( 0x3064)
		#で〜ど→て〜と
		elif 0x3066 <= n <= 0x3069 and n % 2 == 1:
			text = unichr( n - 1 )
		#ば、ぱ〜ぼ、ぽ→は〜ほ
		elif 0x306F <= n <= 0x307D and n % 3 != 0:
			text = unichr( n - (n%3) )
		#ゃ、ゅ、ょ→や、ゆ、よ
		elif 0x3083 <= n <= 0x3088 and n % 2 == 1:
			text = unichr( n + 1 )
	else:
		print "change error."
	return text

#漢字の読み仮名をとってくる関数→「mecab」で実現
def get_yomigana(text):
	p1 = Popen(['echo', text], stdout = PIPE)
	p2 = Popen(['mecab', '-Oyomi'], stdin = p1.stdout, stdout = PIPE)
	p1.stdout.close()
	output = p2.communicate()[0]
	return re.sub(r'\n', '', output)

#末尾に英数字があったら削除する関数
def skip(text):
	skip_list = u"/: .abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789#」…。、??!!〜))ー"
	while skip_list.find(text[-1:])>=0:
		text = text[:-1]
	return text

#テキストをツイートする関数
def tweet(text):
	#ツイート投稿URL
	URL_tweet = 'https://api.twitter.com/1.1/statuses/update.json'
	
	twitter = OAuth1Session(TwitterKEYS.CK,TwitterKEYS.CS,TwitterKEYS.AT,TwitterKEYS.AS)
	
	params = {"status": text}
	req = twitter.post(URL_tweet,params = params)

#テキストの最初の文字をひらがなで返す
def check_first_letter(text):
	#最初の文字をひらがな、カタカナ、先頭4文字の読み仮名の順にチェック
	#最初の文字をひらがなで出す
	first_letter = text[0:1]
	if u'あ' <= first_letter <= u'わ':
		print first_letter.encode('utf-8')
	else:
		first_letter = henkan(first_letter)
		if u'あ' <= first_letter <= u'わ':
			print first_letter.encode('utf-8')
		else:
			yomi = get_yomigana(text[0:4]).decode('utf-8')
			first_letter = henkan(yomi[0:1])
			if u'あ' <= first_letter<= u'わ':
				print first_letter.encode('utf-8')
			else:
				print "cannot define first letter."
				first_letter = u'ん'
	return first_letter

#テキストの最後の文字をひらがなで返す
def check_last_letter(text):
	last_letter = text[-1:]
	last_letter = henkan(last_letter)
	last_letter = change(last_letter)
	return last_letter

#ここからメイン関数
def main():
	
	#はじめの文字をファイルから読み出す
	logfile_path = "/home/ppdr/chain.txt"
	f = open(logfile_path,"r")
	start = f.read().decode('utf-8')[0:1]
	f.close()
	
	print start.encode('utf-8')
	
	#はじめの文字で検索
	req_count = 100	#取得するツイート数
	params = {"q" : start + ' -rt','lang':'ja','count':req_count}	#検索時のパラメータ?
	twitter = OAuth1Session(TwitterKEYS.CK,TwitterKEYS.CS,TwitterKEYS.AT,TwitterKEYS.AS)	#twitteキーを使って認証
	req = twitter.get("https://api.twitter.com/1.1/search/tweets.json",params = params)	#検索結果をjsonで取得
	
	if req.status_code == 200:
		js = json.loads(req.text)
		for i in range(0, req_count):
			txt = js['statuses'][i]['text']
			
			#最初の文字が一致しない場合、除外
			if not(check_first_letter(txt) == start):
				continue
			
			#末尾の英数字を削除
			txt = skip(txt)
			print "skipped:    "+txt.encode('utf-8')
			
			#最後の文字がつぎにつながらない場合、除外
			last_letter = check_last_letter(txt)
			if not(u'あ' <= last_letter <= u'わ'):
				continue
			
			#最後の文字が前回と同じ場合、除外
			if (last_letter == start):
				continue
			
			#ユーザーネーム、プロフィール、スクリーンネームのいずれかに「bot」が入っていたら除外
			bot_check_text = js['statuses'][i]['user']['name']+js['statuses'][i]['user']['description']+js['statuses'][i]['user']['screen_name']
			if ('bot' in bot_check_text) or ('Bot' in bot_check_text) or ('BOT' in bot_check_text):
				continue
			
			#条件確定
			#リツイート
			txt_id = js['statuses'][i]['id']
			req = twitter.post('https://api.twitter.com/1.1/statuses/retweet/'+str(txt_id)+'.json')
			
			if req.status_code == 200:
				print "post success!"
				
				#リツイートが成功したらつぎの文字をファイルに書き出す
				f = open(logfile_path,"w")
				f.write(last_letter.encode('utf-8'))
				f.close()
				
				#つぎの文字をツイート
				txt = u"リツイートしりとり!\n\nつぎの文字は・・・\n『" + txt[-1:] + u"』!!"
				time.sleep(1)
				tweet(txt)
				break
			else:
				print "post filure"
				break
	
	else:
		print "error!"
		print req.status_code
	
if __name__ == "__main__":
	main()