Clojureスクリプトをターミナルで実行する

ここを参考に
http://stackoverflow.com/questions/12064339/how-to-run-clj-file-as-a-script-using-leningen

lein-exec プラグインを使う
https://github.com/kumarshantanu/lein-exec

~/.lein/profiles.clj に記載

{:user {:plugins [[lein-exec "0.3.6"]]}}

スクリプト
test.clj

(import 'javax.swing.JFrame)
(import 'javax.swing.JPanel)
(import 'javax.swing.JButton)

(def frame (JFrame. "Hello Frame"))
(.setSize frame 200 200)
(.setVisible frame true)

(def panel (JPanel.))
(.setContentPane frame panel)

(def button (JButton. "Click Me!"))
(.add panel button)

(.revalidate button)

(while 1)

実行

$ lein exec test.clj

2台のArduinoでI2C通信する

https://www.arduino.cc/en/Tutorial/MasterReader

master

#include <Wire.h>

int bytes;
uint8_t hbyte;
uint8_t lbyte;
void setup() {
  Wire.begin();
  Serial.begin(9600); 
 }

void loop() {
  Wire.requestFrom(8, 6);
  if (!Wire.available()) {
  }
  hbyte = Wire.read();
  lbyte = Wire.read();
  Serial.print("hbyte: 0x");       
  Serial.print(hbyte,HEX);         
  Serial.print(", ");         
  Serial.print("lbyte: 0x");        
  Serial.println(lbyte,HEX);
 
  delay(500);
}

slave

#include <Wire.h>

void setup() {
  Wire.begin(8);
  Wire.onRequest(requestEvent);
}

void loop() {
  delay(100);
}

void requestEvent() {
  Wire.write(0x07); 
  Wire.write(0x20); 
}

2台のmbedでI2C通信する

master
mbed LPC1769

#include "mbed.h"

#define sda p28
#define scl p27
#define addr 0x0a

i2c master(sda, scl);
serial pc(usbtx,usbrx);

int main() {
    char buff[2];
    while(1) {
        master.read(addr,buff,2);        
        pc.printf("%d, ",buff[0]);
        pc.printf("%d \n",buff[1]);        
        wait(1);
    }
}

mbed Nucleo F401RE

#include "mbed.h"

#define SDA PB_9
#define SCL PB_8
#define ADDR 0x0A
#define GETCMD 0x03

I2CSlave slave(SDA, SCL);
Serial pc(SERIAL_TX,SERIAL_RX);

int main()
{
    char buff;
    int receive;
    slave.address(ADDR);
    while(1) {
        receive = slave.receive();
        if(receive==I2CSlave::ReadAddressed) {
            char answer[] = {0x07,0x20};
            slave.write(answer,2);
            pc.printf("replied.\n");
        }
    }
}

Arduino(Master)とmbed(Slave)でI2C通信する

注意点は、

Arduino はスレーブアドレスを7ビットで指定
mbedはスレーブアドレスを8ビットで指定

するというところ。
https://developer.mbed.org/questions/3712/KL46z-as-I2C-Slave/
(Arduinoで指定するアドレス) = (mbedで指定するアドレス) ÷ 2
になる。

Master
Arduino Mega

#include <Wire.h>

#define ADDR 0x01
#define DELAY_T 100
int bytes;
uint8_t hbyte;
uint8_t lbyte;

void setup() {
  Wire.begin();
  Serial.begin(9600); 
 }

void loop() {
  Wire.requestFrom(ADDR, 2);
  hbyte = Wire.read();
  lbyte = Wire.read();
//  Serial.print("hbyte: 0x");       
//  Serial.print(hbyte,HEX);         
//  Serial.print(", ");         
//  Serial.print("lbyte: 0x");        
//  Serial.print(lbyte,HEX);
//  Serial.print(", calc: ");
  Serial.println((hbyte<<8)+lbyte); 
  delay(DELAY_T);
}

Slave
mbed(Nucleo F401RE)

#include "mbed.h"

#define SDA PB_9
#define SCL PB_8
#define ADDR 0x02

AnalogIn ain(PA_0);
I2CSlave slave(SDA, SCL);
Serial pc(SERIAL_TX, SERIAL_RX);

char msg[2];

int main()
{
    msg[0]=0;
    msg[1]=0;
    
    slave.frequency(100000);
    int receive;
    slave.address(ADDR);
    while(1) {
        receive = slave.receive();
        if(receive==1) {
            float fval = ain.read();
            int ival = (int) (fval*5000.0);
            char hbyte = ival / 256; 
            char lbyte = ival % 256;
            msg[0] = hbyte;
            msg[1] = lbyte;           
            slave.write(msg,2);
            pc.printf("fval: %.4f, ADC: %d, hbyte: %d, lbyte: %d\n",fval,ival,lbyte,hbyte);
        }
    }
}