Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Подключение акселерометра к Raspberry Pi с применением библиотеки Pi4J

Anna | 4.06.2014 | нет комментариев

Вступление

Здравствуй, Прогр! Дословно незадолго меня взяли в кружок по робототехнике. Безусловно, я с радостью согласился, это же новейший навык и все такое… Тем больше я каждого лишь первокурсник. Мой преподаватель, объяснив мне всеобщую доктрину, предложил заняться работой с Raspberry Pi. Необходимо было разобраться, как с ним трудиться, установить на него JDK и написать программу, которая выводила бы на экран показания с 3-х осевого акселерометра. Взяв все нужное, я отправился домой разбираться. Когда я все завершил (ушло на это приблизительно неделя), решил написать гайдик, адресованный таким же, как и я, чтобы собрать все, что я нарыл, в одном месте. Ну, славного чтения!

Первым делом

Первым делом необходимо получить доступ к нашему устройству. Подключаться будем посредством протокола SSH. По умолчанию сервер SSH отключен, и Дабы включить его, подключаем Raspberry к монитору либо телевизору, подсоединяем клавиатуру и мышку. Безусловно, дозволено легко просканировать сетевое окружение, выявить наше устройство и подключиться по обнаруженному IP, но все же рекомендую сделать по моему варианту. Позже загрузки запускам терминал и вводим команду sudo raspi-config. В открывшемся меню идем в advanced options->SSH и выбираем Enable. Позже этих манипуляций, должно возникнуть следующее окошко:

image

Отменно! Сейчас мы сумеем приконектиться к нашей “малинке” в всякое время. Давайте сразу пропишем настройки сети. Файл, тот, что нам необходим, находится в каталоге /etc/network/.Переходим туда с поддержкой команды cd /etc/network. Дальше открываем необходимый файл, введя sudo nano interfaces. Тут в соответствующих строках прописываем свои данные, тем самым мы задаем статический IP адрес. Должно получиться приблизительно следующее:

image

Позже нажимаем CTRL X, Y, Enter. Именно по этому адресу будем подключаться. Дальше скачиваем клиет SSH — PuTTY. Запустив программу, вы увидите следующее окно:

image

Тут в поле Host Name пишем тот самый ip, тот, что мы прописали в interfaces. Тут же дозволено сберечь настройки, прописав в поле Save Session имя и нажав на Save. Нажимаем Open. Как только PuTTY подключится к SSH серверу, откроется окно, и появится запрос учетных данных (по умолчанию, пользователь: pi, пароль: raspberry):

image

Не пугайтесь, что при вводе вы не видите пароль, в Linux сходственных системах пароль легко не виден, правда ввод происходит. Нажимаем Enter. Если все прошло благополучно, вы увидите следующее окошко:

image

В этой консольке дозволено исполнять всякие команды, и они будут исполнены на самом устройстве. Выдумка ли комфортно?

Установка JDK

Тут все достаточно легко. Обновляем список пакетов, введя в терминале sudo apt-get update.

image

Обновим и саму систему sudo apt-get upgrade.

image
На все это может потребоваться достаточно много времени (у меня это обновление проходило приблизительно 30 минут), так что запаситесь чаем. Известность великой силе, что в списки пакетов был добавлен пакет JDK, и нам не пришлось танцевать с бубном. Для установки пакета легко вводим sudo apt-get install openjdk-7-jdk.

Для проверки работоспособности вводим java -version. Вы обязаны увидеть приблизительно следующее:

image

P.S. На некоторых машинах может появиться задача, связанная с тем, что система не находит пакет JDK. Она появляется из-за несовместимости ядра Debian “wheezy” с java. Испробуйте переустановить ОС на Soft-float Debian “wheezy”, оптимизированную для работы с java. В любом случае на моей “малинке” все встало с первого раза. Вот моя версия:

image

I2c vs Raspberry PI

Выходит, сейчас начинается самое увлекательное! Для начала, давайте разберемся, что это вообще такое? Великая и мощная Википедия говорит:
Iь необходимо произвести калибровку акселерометра. Лезем в документацию.

image

У кого вовсе все нехорошо с английским. В моем вольном переводе: “После включения LSM303DLH нужно произвести конфигурацию устройства по 2 регистрам CTRL_REG1_A(20h) и CTRL_REG2_A (23h). Для этого в 1-й регистр пишем 0×27 для типичной работы с ODR 50гц.

Пишем 0*40 во 2-й регистр для того, Дабы сберечь полный диапазон измерений – 2 гаусс в постоянном обновлении базы данных и изменить порядок байтов от младшего к старшему на порядок, от старшего к младшему.”

Для записи данных в устройство воспользуемся способом write из класса I2CDevice. Допишем программу:

import java.io.IOException;
import com.pi4j.io.i2c.I2CBus;
import com.pi4j.io.i2c.I2CDevice;
import com.pi4j.io.i2c.I2CFactory;

public class accelerometrOne {
	static I2CDevice device;
	static I2CBus bus;
	static byte[] accel;
    public static void main(String[] args) throws IOException {
        System.out.println("Starting sensors reading:");
        try {
           bus = I2CFactory.getInstance(I2CBus.BUS_1);
           System.out.println("Connected to bus OK!");

           device = bus.getDevice(0x18);
           System.out.println("Connected to device OK!");

           device.write(0x20, (byte) 0x27);
           device.write(0x23, (byte) 0x40);
           System.out.println("Configuring sensors OK!");

        } catch (IOException e) {
           System.out.println(e.getMessage());
        }
    }

Отменно!!! Осталось считать данные с устройства. Вновь лезем в документацию и узнаем, что данные выдаются по 2 байта на всякую ось:
image

Ну и все. Записываем полученные байты в массив и выводим данные на экран:

import java.io.IOException;
import com.pi4j.io.i2c.I2CBus;
import com.pi4j.io.i2c.I2CDevice;
import com.pi4j.io.i2c.I2CFactory;

public class accelerometrOne {
	static I2CDevice device;
	static I2CBus bus;
	static byte[] accel;
    public static void main(String[] args) throws IOException {
        System.out.println("Starting sensors reading:");
        try {
           bus = I2CFactory.getInstance(I2CBus.BUS_1);
           System.out.println("Connected to bus OK!");

           device = bus.getDevice(0x18);
           System.out.println("Connected to device OK!");

           device.write(0x20, (byte) 0x27);
           device.write(0x23, (byte) 0x40);
           System.out.println("Configuring sensors OK!");

           readingsensors();

        } catch (IOException e) {
           System.out.println(e.getMessage());
        }
    }

    private static void readingsensors() throws IOException {
		while (true) {
			accel = new byte[6];
			accel[0] = (byte) device.read(0x28);
			accel[1] = (byte) device.read(0x29);
			accel[2] = (byte) device.read(0x2a);
			accel[3] = (byte) device.read(0x2b);
			accel[4] = (byte) device.read(0x2c);
			accel[5] = (byte) device.read(0x2d);
			int accelx = asint(accel[0]) * 256   asint(accel[1]);
			int accely = asint(accel[2]) * 256   asint(accel[3]);
			int accelz = asint(accel[4]) * 256   asint(accel[5]);
			System.out.println("accelx: "   accelx   ", accely: "   accely
					  ", accelz: "   accelz);
		}
	}
    private static int asint(byte b) {
        int i = b;
        if (i < 0) {
            i = i   256;
        }
        return i;
    }
} 

В результате, позже запуска мы увидим приблизительно следующее:

image

 

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB