Поиск по этому блогу

суббота, 14 ноября 2015 г.

Weather station: Chibios, stm32f051, bmp180, DHT11 sensor and 1.3 OLED sh1106 display

Although I am an electronic engineer, periodically I want to spend my time constructing some fancy devices for home. Last weekend's project was a Meteorology station - I really need to know the temperature, pressure and humidity in my apartment!

So, the first thing to do - decide what hardware platform fits well. I choose STM32F051 MCU (it's really cheap and powerful enough for my modest needs). The compiler should be arm-none-eabi-gcc, RTOS - Chibios, graphical engine - uGFX.
The other thing to deal with - its sensors! Well, let's forget about analogue sensors. All we need are modern digital devices! I personally hate calibration, because it's too tedious to tune every sensor individually.
BMP180 Sensor

DHT11 Sensor
So, I've selected Bosch Sensortec's bmp180 sensor for temperature and pressure. For the humidity I've selected a cheap Chinese DHT11 sensor. Maybe this was a mistake, because it was not easy to make it work properly.

To show the information it has a 1.3' OLED display. BMP180 is I2C sensor, and the display uses this bus as well. The DHT11 sensor uses it's self-brew protocol, quite tricky for implementation with any RTOS, because you have to use micro-secondary delays to get data.

The schematics are quite simple:
The PCB layout is simple too.

The only mess I had was that I routed the DHT11's data line to the PB2 pin of the MCU. This pin unable to perform a ICU (interval capture unit) feature :( So, I had to implement sensor reading using a conventional the GPIO port function. Here there is an example of how to use this hardware feature with a DHT11, but due to already-produced PCBs I can't use this approach.
So, I grabbed my logic analyzer and ran it with Sigrok. I was happy to find that the latest Sigrok has an embedded decoder for the DHT11 protocol!


Okay, the code has been uploaded to github. Enjoy!




среда, 18 февраля 2015 г.

Using Ethernet PHY with STM32F4DISCOVERY in Chibios

Ethernet with Chibios on STM32F4Discovery


STM32F4DISCOVERY board is rather chip and can be easily purchased for the price near 25$.  It features powerful stm32F407 MCU, with FPU, MAC, USB and 1Mb of flash. Moreover, it runs on 168 MHz frequency. So your tasks will run really fast! For my projects I use Chibios/RT, which make developing applications just a piece of cake, because of many ready to use drivers and many devboards support "out of the box".
stm32F407 supports MAC, so we can go to eher/inter net to send/receive data. I used module with PHY from aliexpress.com, with DP8 from Texas Instruments.
You can find my code in github

OMG, quadcopter!

Hello guys.
It is time  for me to switch on English.
I started to construct my own quadcopter. As well as I am ChibiOS fan, I decided to use Taulabs flying controller, because they plan was to get rid of FreeRTOS and use Chibios there.
For now I decided to use my STM32F3Discovery as a platform.



This cheap board already has a magnetometer, accelerometer and gyroscope.
I just needed an adapter and I ordered one on seedstudio. Gerbers can be found in Taulabs' software pack in the hardware folder. Not bad!


Ok, but what about the frame, engines, ESCs, battery and numerous other stuff? I used recomendations from these videos.
I bought the recomended frameESCs and  A2212 930KV motors.
I also bought the FlySky TH9X Radio.

Assembled copter:

So, it is almost time to fly!
Here is a video on very first fly on YouTube:
https://www.youtube.com/watch?v=JToOy15wG7o


вторник, 2 октября 2012 г.

Операционная система реального времени Chibios/RT (Введение)

Даю ссылку на свою статью на easyelectronics.ru. Это вводная статья про интересную ОСРВ Chibios. На работе использую ее в прототипе платы ввода-вывода промышленного контроллера.
Работает как часы, зараза :) 

понедельник, 26 марта 2012 г.

Yet another msp430-based clock (YAMBC)

Часы реального времени PCF8583 + MSP430G2553 (launchpad)
Мы с женой любим путешествовать. Но наша игуана Вася это якорь, который не всегда дает нам возможность отлучиться надолго :) Утром ему нужно включить лампы и нагреватель, вечером выключить. Поэтому я решил автоматизировать этот процесс. Для определения времени нужна микросхема часов реального времени (с резервной батарейкой, если вдруг пропадет питание). Также в часах есть дополнительная RAM память, где можно хранить настройки, чтобы не портить flash микроконтроллера циклами записи/перезаписи.
Итак, coming soon. Материал получился объемный, так что буду выкладывать частями.

воскресенье, 21 августа 2011 г.

Софтовый i2c и общение с датчиком DS1624

Возник на горизонте один проект, в котором было решено использовать новые контроллеры с продвинутым Сигма-дельта АЦП 24бит (!) MSP430AFE253. У контроллера встроенно три(!) независимых сигма-дельта АЦП, и это чудо в компеле стоит около 2$.
Заказал у TI some Free samples и попросил заказчика купить небольшую партию для установочного производства... Срок поставки 3 недели. Решил пока поэксперементировать с недавно пришедшими по FedEx в наши *ня двумя новыми MSP430G2452, которые дружат с Launchpad после обновления прошивки. На них и отработаю soft i2c.
Проблема у 253 следующая: там нет аппартного модуля i2c. Но этот кристалл также должен управлять цифровыми потенциометрами по этому протоколу. Сначала я пригорюнился, но потом храбро решил реализовать i2c программно. В режиме мастера это не так сложно.
Digipot тоже ехал с эльфийского Запада неторопливо. Поэтому, порывшись по сусекам обнаружил завалявшийся DS1624 - продвинутый цифровой термометр, с точностью до 0.3С.
Почему нет? попробую считать температуру, используя софтовый i2c.
Нашел замечательную библиотеку у levap. Вся библиотека состоит из 2х файлов -
Достаточно в i2c_soft.h прописать какие порты пины используются, и почти все заработает. Правда его библиотека под msp-gcc, а я проект делал в Code composer studio.  Поэтому вызов функции nop() пришлось заменить на _nop().
Для линий данных использовал GPIO пин 2.4 а для синхронизации 2.3.

#define I2COUT P2OUT    // Write to Port
#define I2CIN P2IN     // Read from Port
#define I2CDIR P2DIR    // Set Port Direction
#define I2CSEL P2SEL    // Alternative Port Fuctions


#define SDA       BIT4     // Serial Data Line PIN
#define SCL       BIT3     // Serial Clock Line PIN

Потом распаял на макетке датчик температуры, 2 подтягивающих резистора 4.7кОм на Vcc, заземлил выходы датчика A1-A3 (см. даташит).
Вот что получилось:

Снимал телефоном, качество не очень. Но понять что к чему подключено можно. На датчик +5В брал с USB разъема.
Для быстрой смены параметров кристалла использовал Grace - новую визуальную примочку к CCS от TI. Позволяет визуально задавать параметры кристалла (тактирование, пины, USI и т.д.). Неплохая вещь, хотя можно и без нее.
Вот код общения с датчиком:



#define ACCESS_MEM      0x17
#define ACCESS_CONF     0xAC
#define READ_TEMP       0xAA
#define START_CONVERT   0xEE
#define STOP_CONVERT    0x22
#define READ            0x01
#define WRITE           0x00






unsigned int DS1624ReadTemperature(void)
{
    volatile unsigned int temp, ack;
    i2c_Init();
    i2c_Start();
    ack=i2c_Write(0x90); // W=0,R=1 b1001000W 
    ack=i2c_Write(START_CONVERT); 
    while(1)
    {
  i2c_Start();
        ack=i2c_Write(0x90);
        ack=i2c_Write(ACCESS_CONF);
        i2c_Start();
        ack=i2c_Write(0x90);
        if (i2c_Read(0) & 0x80)
            break;
    }
    i2c_Start();
    ack=i2c_Write(0x90);
    ack=i2c_Write(READ_TEMP);
    i2c_Start();
    ack=i2c_Write(0x91);//read
    temp = (unsigned int)i2c_Read(1);//1st byte
   // temp <<= 8;
   // temp |= (unsigned int)i2c_Read(1);//2nd byte. дает точность 0.3С после запятой. Ненадо
   if (temp>125)//если t меньше 0
   {
    temp = 255-temp;
   }
   
    i2c_Stop();
    return temp;
}






среда, 9 февраля 2011 г.

Средства разработки MSP430 для Ubuntu Linux 10.04 -10.10


Так исторически сложилось, что я очень не люблю операционную систему Windows. Во всех ее проявлениях. О причинах этого можно говорить долго и увлекательно, но не будем :)
К сожалению два основных средства разработки для MSP430 - Code Composer studio и IAR Kickstart не поддерживают Linux :(
Впрочем от CCS мы, наверное, этого и дождемся со временем - начиная с 4 версии он переехал на платформу Eclipse. Осталось портировать компилятор.
Но есть и альтернатива - mspgcc. Бесплатная... Delicious.
Из разных источников [1] [2] [3] я собрал рецепт сборки рабочей среды для Ubuntu.
Итак, приступим
Для начала установим необходимые библиотеки и компилятор gcc


sudo aptitude install git-core gcc-4.4 texinfo patch libncurses5-dev zlibc zlib1g-dev libx11-dev libusb-dev libreadline6-dev


Качаем порт mspgcc для gcc4 отсюда
или вводим команды, чтобы взять из репозитария git (на работе git не смог пробиться через прокси, а дома все ОК)


git clone git://mspgcc4.git.sourceforge.net/gitroot/mspgcc4/mspgcc4


Если скачали архив, то распаковываем его в домашнюю директорию. Переименуйте папку mspgcc4-20110130 в mspgcc4.

cd mspgcc4 && perl buildgcc.pl


Запуститься скрипт сборки. На все вопросы можно жать Enter (по умолчанию) кроме вопроса о сборке - там нужно ввести "y" чтобы процесс сборки запустился. Также спрашивает ставить ли Insight - древний деббагер - можно сказать n, тем более что с ним бывают проблемы при сборке.
Можно попить кофе пока идет сборка.
После сборки в /opt появиться папочка msp-gcc-4.4.5. Неплохо бы сделать симлинк 


sudo ln -s  msp430-gcc-4.4.5/ mspgcc


и добавить его в path. Теперь можно компилировать, например,


msp430-gcc -Os -mmcu=msp430x2231 -o led.elf led.c


led.c, например, такой:



01./* Пример моргания диодом */
02. 
03.#include <msp430g2231.h>
04. 
05./** Задержка. **/
06.delay(unsigned int d) {
07.int i;
08.for (i = 0; i<d; i++) {
09.nop();
10.}
11.}
12. 
13.int main(void) {
14.WDTCTL = WDTPW | WDTHOLD;// отключаем Watchdog таймер
15.P1DIR = 0xFF;
16.P1OUT = 0x01;
17. 
18.for (;;) {
19.P1OUT = ~P1OUT;
20.delay(0x4fff);
21.}
22.}



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



tar -zxvf mspdebug.tar.gz
cd mspdebug
make
sudo make install


Чтобы можно было работать с LaunchPad не из под root, нужно задать udev правило.


sudo nano /etc/udev/rules.d/46-TI_launchpad.rules


Вписываем туда :


ATTRS{idVendor}=="0451", ATTRS{idProduct}=="f432", MODE="0660", GROUP="plugdev"


Перезапускаем udev:


sudo restart udev

Подключите Launchpad. 



mspdebug rf2500
prog led.elf

run



Программа прошьется в контроллер и плата заморгает красным глазком...