【Java】Raspberry Piで赤外線送信
pigpioを使った赤外線受信をJavaで実装してみたので、自分用に内容を記事にしときたいと思います。
前回の記事で赤外線送信を動かす為の配線を行いましたので、これを動かしていきます。
http://abyz.me.uk/rpi/pigpio/code/irrp_py.zipの赤外線送信のpythonコードをJavaに置き換えただけです。
Javaで試す場合、いちいちラズパイでコンパイルするのは面倒なのでリモートでテストしていきます。
リモートでGPIO操作を行う場合、リモートGPIOの有効化を行う必要があります。リモートGPIOの有効化は下記の記事で説明しています。
当然ですが、ラズパイ側のpigpioデーモンも起動しておいてくださいね。
使用するライブラリはこれ。
https://github.com/nkolban/jpigpio
一部ライブラリのバグを修正した奴は私がアップしています。
https://github.com/nompor/jpigpio
プログラム上で指定するのはピン番号ではなくGPIO番号です。
プログラムは赤外線受信の記事で生成したJSONテキストを読み込み赤外線LEDを点灯させ、TVなどの家電を操作します。
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
import jpigpio.Pigpio;
import jpigpio.PigpioException;
import jpigpio.PigpioSocket;
import jpigpio.Pulse;
public class InfraredSendOsi5la5113aTest {
int GPIO = 18;
String FILE = "recv.txt";
int GLITCH = 100;
int PRE_MS = 200;
int POST_MS = 150;
int FREQ = 38;
boolean VERBOSE = true;
int SHORT = 10;
int GAP_MS = 100;
int TOLERANCE = 15;
int POST_US = POST_MS * 1000;
int PRE_US = PRE_MS * 1000;
double GAP_S = GAP_MS / 1000.0;
double TOLER_MIN = (100 - TOLERANCE) / 100.0;
double TOLER_MAX = (100 + TOLERANCE) / 100.0;
PigpioSocket pi = null;
List<Pulse> carrier(int gpio, double frequency, double micros) {
List<Pulse> wf = new ArrayList<>();
double cycle = 1000.0 / frequency;
int cycles = (int)Math.round(micros/cycle);
int on = (int)Math.round(cycle / 2.0);
int sofar = 0;
for (int c=0;c < cycles;c++) {
int target = (int)(Math.round((c+1)*cycle));
sofar += on;
int off = target - sofar;
sofar += off;
wf.add(new Pulse(1<<gpio, 0, on));
wf.add(new Pulse(0, 1<<gpio, off));
}
return wf;
}
public static void main(String[] args) throws PigpioException {
new InfraredSendOsi5la5113aTest().execute();
}
public void execute() throws PigpioException {
String host = "192.168.22.122";//IPは変えてください。
pi = new PigpioSocket(host, 8888);
pi.gpioInitialize();
List<Integer> code = null;
try {
String s = Files.readString(Paths.get("recv.txt"));
s = s.replaceAll("\\[|]|\\s", "");
code = Arrays.stream(s.split(",")).map(e -> Integer.parseInt(e)).collect(Collectors.toList());
}catch(Exception e) {
e.printStackTrace();
}
pi.gpioSetMode(GPIO, Pigpio.PI_OUTPUT);
pi.waveAddNew();
System.out.println("Playing");
HashMap<Integer,Integer> marks_wid = new HashMap<Integer,Integer>();
HashMap<Integer,Integer> spaces_wid = new HashMap<Integer,Integer>();
int[] wave = new int[code.size()];
for( int i=0;i< code.size();i++) {
int ci = code.get(i);
if ((i & 1) == 1){
if (!spaces_wid.containsKey(ci)) {
pi.waveAddGeneric(new ArrayList<>(List.of(new Pulse(0, 0, ci))));
spaces_wid.put(ci,pi.waveCreate());
}
wave[i] = (int)spaces_wid.get(ci);
}else {
if (!marks_wid.containsKey(ci)){
List<Pulse> wf = carrier(GPIO, FREQ, ci);
pi.waveAddGeneric(new ArrayList<>(wf));
marks_wid.put(ci,pi.waveCreate());
}
wave[i] = (int)marks_wid.get(ci);
}
}
pi.waveChain(wave);
while (pi.waveTxBusy()) {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
for(Integer i :marks_wid.keySet() ){
pi.waveDelete(marks_wid.get(i));
}
marks_wid = new HashMap<Integer,Integer>();
for(Integer i :spaces_wid.keySet() ){
pi.waveDelete(spaces_wid.get(i));
}
spaces_wid = new HashMap<Integer,Integer>();
pi.gpioTerminate();
}
}
Playing
記録した赤外線リモコンと同じ操作ができれば成功です。
関連記事













ディスカッション
コメント一覧
まだ、コメントがありません