忘備録-備忘録

技術的な備忘録

Raspberry piでアナログ入力2

2019-11-19 22:01:24 | raspberry ...

Raspberry piにはアナログ入力端子がありません。Microchip Technology 社のSPI接続ADコンバータIC MCP3208を使用してアナログ電圧の入力ができるようにてみました。

回路図は前回の投稿を見てください。

 プログラム C言語

#include <stdint.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/types.h>
#include <linux/spi/spidev.h>

#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))

void pabort(const char *s)
{
	perror(s);
	abort();
}

static const char *device = "/dev/spidev0.0";
static uint8_t mode = SPI_MODE_0;
static uint8_t bits = 8;
static uint32_t speed = 500000;
static uint16_t delay = 0;

/*
*  SPIの初期化
*  戻り値: SPIのfd
*/
int initSPI(void)
{
	int ret = 0;
	int fd;

	fd = open(device, O_RDWR);
	if (fd < 0)
		pabort("can't open device");

	/*
	 * spi mode
	 */
	ret = ioctl(fd, SPI_IOC_WR_MODE, &mode);
	if (ret == -1)
		pabort("can't set spi mode");

	ret = ioctl(fd, SPI_IOC_RD_MODE, &mode);
	if (ret == -1)
		pabort("can't get spi mode");

	/*
	 * bits per word
	 */
	ret = ioctl(fd, SPI_IOC_WR_BITS_PER_WORD, &bits);
	if (ret == -1)
		pabort("can't set bits per word");

	ret = ioctl(fd, SPI_IOC_RD_BITS_PER_WORD, &bits);
	if (ret == -1)
		pabort("can't get bits per word");

	/*
	 * max speed hz
	 */
	ret = ioctl(fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed);
	if (ret == -1)
		pabort("can't set max speed hz");

	ret = ioctl(fd, SPI_IOC_RD_MAX_SPEED_HZ, &speed);
	if (ret == -1)
		pabort("can't get max speed hz");

	printf("spi mode: %d\n", mode);
	printf("bits per word: %d\n", bits);
	printf("max speed: %d Hz (%d KHz)\n\n", speed, speed/1000);

	return fd;
}

int transfer(int fd,int ch)
{
	int ret;
	unsigned val = 0;
	double x;
	uint8_t tx[3];
	uint8_t rx[3];
	struct spi_ioc_transfer tr = {
		.tx_buf = (unsigned long)tx,
		.rx_buf = (unsigned long)rx,
		.len = ARRAY_SIZE(tx),
		.delay_usecs = delay,
		.speed_hz = speed,
		.bits_per_word = bits,
	};

	tx[0] = 0x06|((ch>>2)&0x01);         //AD start , single end
	tx[1] = ch<<6;
	tx[2] = 0x00;
	ret = ioctl(fd, SPI_IOC_MESSAGE(1), &tr);
	if (ret < 1)
		pabort("can't send spi message");

	val = ((rx[1] & 0x0f) << 8) | rx[2];

	return val;
}


int main(int argc, char *argv[])
{
	int fd;
	int val;

	fd = initSPI();
	val = transfer(fd,0);
	printf("value = %04x\n",val);

	return 0;
}

 

参考


Raspberry pi でアナログ入力

2019-11-19 21:06:53 | raspberry ...

Raspberry piにはアナログ入力端子がありません。Microchip Technology 社のSPI接続ADコンバータIC MCP3208を使用してアナログ電圧の入力ができるようにてみました。

回路図 3.3V電源

回路図 5V電源

Raspberry pi本体は3.3Vで動作しているため5V出力のICを直接接続するとよいことはないので、抵抗で電圧を返還しています。


プログラム python

#!/usr/bin/env python3
# MCP3208 ADコンバータ制御プログラム

import spidev
Vref = 3.3 #リファレンス電圧
ch = 0     #変換チャンネル

spi = spidev.SpiDev()
spi.open(0,0#port 0,cs 0

# 電源電圧が3.3Vのとき最大500kHz
# 電源電圧が5Vのとき最大1MHz
spi.max_speed_hz = 500000
 
adc = spi.xfer2([0x06|((ch>>2)&0x01),ch<<6,0x00])
data = ((adc[1] & 0x0f) << 8) | adc[2]
print (str(Vref*data/4095) + "V")
 
spi.close()


プログラム javascript

$ npm install pi-spi  

コマンドでライブラリをインストールする。

var SPI = require('pi-spi');

var spi = SPI.initialize("/dev/spidev0.0");
spi.clockSpeed(500000);
spi.dataMode();
spi.bitOrder(SPI.order.MSB_FIRST);

channel = 0;

var buf = new Buffer.alloc(3);
buf[0] = 0x06|((channel>>2)&0x01);
buf[1] = channel << 6;
buf[2] = 0x00;

spi.transfer(bufbuf.length,function(e,d) {
        if (econsole.error(e);
    else {
        var val;
        val = ((d[1] & 0x0f) << 8) | d[2];
        console.log("ad value "val)
    }
});

spi.close(function(e) {
    if (econsole.error(e);
});



日本語フォントをインストールする

2019-11-18 20:10:18 | raspberry ...

Raspberry piのOS raspbianはセットアップ時に日本語を選択すると自動的にフォントなど日本語の表示と入力に必要なデータをダウンロードしてくれますが、うまく日本語フォントがインストールできないときは、次のようにインストールします。

$ sudo apt install fonts-noto-cjk

 BlueJ Java IDE はこのフォントではうまく表示されないようです。IPAフォントをインストールすると日本語の表示が正しく行えます。

$ sudo apt install fonts-ipafont fonts-ipaexfont 

参考

Linuxだって、綺麗にフォントが表示できるんだからねッ!