Логическое И на биполярных транзисторах или как быть когда нужно много UARTов

Как быть когда нужно много UARTов (или любой другой штуки)

Зачастую аппаратных UARTов можно сделать не так уж и много. А иногда и вовсе один. Например, на Raspberry Pi. Что же делать если у вас есть 2 устройства с которыми нужно общаться именно по этому протоколу?

Необходимо сделать схемку коммутации сигналов.

По сути все просто, на вход приходит сигнальная линия и несколько коммутационных. Каждому такому входу соответствует свой выход в который направится сигнал при запихивании лог единички в соответствующий вход.

Соответсвующая логическая схема чисто на логических И.

Теперь как же это должно выглядеть в железе.

Логическое И на биполярных транзисторах

Смотрим в следующую статью: http://www.schoolinfo1.narod.ru/elements2.htm. Там пишут что для лог. И нужно 2! транзистора. Жируют=) В общем я подумал и решил что можно сделать на одном:

Вот и все.

Полезные статьи:
https://ru.wikipedia.org/wiki/

http://electrik.info/main/praktika/751-shemy-vklyucheniya-bipolyarnyh-tranzistorov.html

Запускаем Cubieboard2 UART

Для работы с UART на Cubieboard2 под Android необходимо:

  1. Поставить Android Terminal Emulator
  2. Поставить например Serial Port API Sample или любую другую программу для работы с UART
  3. Иметь на компе любой терминал. Я использую такой терминал

Теперь собственно мы готовы к работе.

Запускаем Терминал эмулятор

Пишем в нем:

$ su
# ls -l /dev/ttyS*

Получаем список UART портов. У меня ttyS0, ttyS2. У них нет прав на запись и чтение, даем их им (по этому поводу моно почитать здесь):

# chmod 666 /dev/ttyS*

ОК. Идем дальше. Запускаем Serial Port:

Setup -> Device -> /dev/ttyS0
Setup -> Baud rate -> 115200

Нажимем Loopback.

Соединяемся

Теперь требуется каким-либо образом соединить UART компа с устройством.

Для этого можно использовать FT232RL или плату о которой я говорил в прошлый раз. Если используете DVK521 то не забудьте подключить проводок:

На Cubie и на DVK521 соединить UART.

Переходим к компу

К USB порту на расширительной плате подключаем комп. Драйверы для платы PL2303 можно установить здесь.

Запускаем Terminal на компутере. Выбираем соответствующий COM порт и скорость 115200, соединяемся. Если на Cubie запустить Loopback то в Терминале сразу польется поток хрени. Это значит что все работает.

Более вразумительной проверкой работоспособности можно в Console

Как связать ПК с контроллером ATmega

Ранее я делал схему для связи любого ПК с МК. Теперь рассмотрим как все это выглядит со стороны контроллера и со стороны ПК.

Сторона контроллера

2013-03-29 22.36.32

Для контроллера это простой UART. Когда компьютер посылает какие-либо данные контроллер вызывает прерывание и дальше мы обрабатываемым эти данные. Для этого лучше написать 2 простые функции.

void USART_Init(){
	//UCSRA=(1<<U2X);
	UCSR0B=(1<<RXCIE0)|(1<<RXEN0)|(1<<TXEN0)|(1<<TXB80)|(1<<RXB80);
	//UCSRC=(1<<UCPOL);
	UBRR0H=0;//
	UBRR0L=1;//bound
	//TXD/PD1 - Output
	DDRD |= (1<<PD1);
}
void transmitUART(unsigned char data_){
	while( !(UCSR0A&(1<<UDRE0)) );
	UDR0 = data_;
}

И все остальное можно обрабатывать в прерывании примерно так

ISR(USART_RX_vect){
	transmitUART(UDR0);
	switch(usartBuffer){
		case 0x31:
			if(n==0){
				PORTB |= (1<<PB1);
				PORTB &= ~(1<<PB2);
				n=1;
			}else{
				PORTB |= (1<<PB2);
				PORTB &= ~(1<<PB1);
				n=0;
			}
		break;
		default:
			// DEFAULT OP
		break;
	}
}

Что-бы общение было хоть как-то осмысленным принимаем что первый принятый байт посылки - команда, а дальше действуем по желаемой модели. Например команда 0×31 ( ASCII = 1 ) будет переключать светодиоды на контроллере.

Вот и все, теперь можно переходить к ПО для ПК.

Сторона ПК

Снимок3

Тут я выбираю, наверное, самое простое решение. Опен соурс SharpDevelop, очень удобен и все необходимое включено, при том без танцев с бубном.

И так, C# это совсем не тоже самое что С/С++, но все же Си.

Нам нужна будет библиотека работающая с периферией, называется она так

using System.IO.Ports;

Дальше создается экземпляр класса, настраиваем его и можно отправлять посылки.

public static SerialPort serialPort1 = new SerialPort();
serialPort1.PortName = "COM4"; //Указываем наш порт
serialPort1.BaudRate = 256000;//9600; //указываем скорость.
serialPort1.DataBits = 8; 
serialPort1.Open(); //Открываем порт.

//Событие вызовется когда получены данные
serialPort1.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler_);

//Посылаем контроллеру информацию
serialPort1.WriteLine("1");//0x31

Всяческие приблуды в виде оконного приложения и обработки нажатия на кнопку не буду рассматривать.

 

PS: Подытожу. На ПК запускается приложение в котором описана логика взаимодействия пользователя с периферийным устройством, это приложение посылает/принимает информацию от устройства.

Печатная плата своими руками

Расскажу о моем первом опыте изготовления плат по ЛУТ. Вот наиболее подробная инструкция.

2013-03-29 22.36.32

И так, необходимость возникла только потому что злобная компания FTDI не хочет делать переходник USB<->USRT в корпусе DIP. А забивать память МК библиотекой на USB не хочется.

Все делал прямо по инструкции:

0. Закупил все что нужно

2013-03-28 19.50.29

 

  1. Хлористое железо
  2. Припой ножик канцелярский
  3. Провод
  4. Ванночка для травления
  5. Шкурка (самая мелкая)
  6. Глицерин ( в аптеке 7р)
  7. Однослойный текстолит
  8. Электрические компоненты

1. Нарисовал плату, распечатал на лазерном принтере

2013-03-28 19.59.43

 

Не забудьте инвертировать плату по одной оси до распечатки. Руками не трогать, только за края. Фольгу прошкурить.

2. Отутюжил, смыл

2013-03-28 20.32.46

 

Не зря сделал сразу 10 шт, так и знал что что-то может пойти не так. Либо плохо прогладил либо пальцем ляпнул не знаю, но -2 штуки сверху. Глянец в некоторых местах сходит очень тяжело, но он не влияет на травление.

 

3. Вытравил и выпилил

2013-03-28 21.47.40 2013-03-29 10.40.40

 

Выбрал экземпляр получше выпилил его. и только после этого заметил что не хватает кружков в некоторых местах и одной дорожки. Ну да ладно.

Дальше все это дело покрывается глицерином ( его не жалеть ) и лудится. Во время пайки лучше сначала позиционировать компонент, потом прижать его зубочисткой и ненадолго приложить жало к месту контакта.

Самое мучение с многоконтактными элементами (FT232). Сначала припаиваем 1 ногу крайнюю, потом, если другие ногу немного не совпадают, поворачиваем вокруг нее и припаиваем противоположную дальше сами знаете.

 

4. Залудил припаял контрольный диод, а потом и все остальное

2013-03-29 21.34.48

 

 

Вот видео как работает FT. С ПК посылаю команду на переключение светодиодов.

 

Флэшка своими руками

Привет всем. Для создания своей флэшки с блэк джеком и шлюхами я взял модуль памяти M25P32 (документация), контроллер ATMega168 (документация) и конвертер USB<->UART (SerialPort) (документация).

И так. Зачем все это нужно?

Предположим, что мы хотим сделать устройство в котором можно хранить информацию, и при этом считывать ее и записывать могли бы только мы. Или сделать устройство которое автономно бы делало какие либо измерения, а потом забрав его можно было бы узнать чего он там наизмерял. В общем применение этой схемы довольно обширна.

Схема

Без имени-2

Это документация на используемые схемы. Там же и есть способы их подключения.

FT232RL_V202 m25p32 atmega168

 

 

 

 

 

 

По сути же схема выглядит так

 

Протоколы

Здесь мы используем 2 основных протокола. Это UART и SPI оба они реализованы в контроллере, остается только привести их в удобный для себя вид.

Терминал

 

Основные ошибки с UARTом:

  • Забыть линию TXD настроить выходом ( например DDRD |= (1<<PD1) )
  • Скорость передачи лучше брать из стандартного ряда а значения для UBBR из мануала

Для проверки я использовал вот эту прогу (Terminal)

Не забывать при SPI:

  • Задать все порты (входы выходы)
  • Давать задержку между передачей и принятием данных

Программа

Для своего удобства разделил программу на несколько блоков

Вообще-то этот проект сделан чтобы автоматически прибавлять числа и записывать в память, но от изначальной задачи он отличается совсем немного.

Все изменения будут заключены в одном единственном блоке.

Пусть у нас будет 3 комманды:

  1. Запись данных
  2. Считывание данных
  3. Стирание

Изменения будут только в блоке прерывания:

ISR(USART_RX_vect){
 if(command==0xFF){
  command = UDR0;
 }else{
  switch(command){
   case 0x01://Запись данных

   break;
   case 0x02://Чтение данных

   break;
   case 0x03://Стирание данных

   break;
  }
 }
}

Проект

SoftWare

Наверное отдельно рассмотрю как делать ПО для такого типа приложений в другой статье. Но в общем и целом эта программа должна подключаться к одному из COM портов и передавать определенные пакеты данных.

HardWare

Это плата на которой это все тестилось.

2013-02-13 11.40.52

 

Питание так же от USB.

Заключение

Самое лучшее применение этой идеи, я думаю в дистанционных приборах, которые остаются где-либо и записывают что-то. Потом, с помощью специальной программы данные считываются и обрабатываются.