Найти тему
Меандр Радиолюбитель

Трансивер "Радио-76 М2" часть первая, S-Метр.

Всем доброго, недавно один из подписчиков подарил мне платы от трансивера Радио-76 М2 в рабочем состоянии. Трансивер Олегу собирал его приятель и он чуточку отличается от типовой схемы опубликованной в журнале "Радио" и размещенной на многих сайтах в интернете. Отличия не только конструктивные но и схемные. К сожалению схемы автора нет, а сам я её пока еще не нарисовал, Схема будет в следующих частях из этой серии.
В данной же заметке, хочу рассказать об S-Метре. Родной индикатор был выполнен на стрелочном приборе маленьких габаритов, кроме того, шкала прибора размечена под индикатор уровня какого-то магнитофона. Еще до того как определился с корпусом, планировал применить более крупную головку с собственной шкало, но после того как созрел корпус, стало понятно, что такой прибор просто не поместится на передней панели.
Пока был на вахте, поглядывал в сеть, искал альтернативы.
На одном из Ютюб каналов нашел интересную реализацию S-Метра, на ардуино и OLED дисплее.

Ссылок на схему и исходники автор не дал, но мне повезло - в комментариях под видео, автор опубликовал текст исходного кода в среде "Arduino IDE".
Оттуда и был скопирован код.
Схема предельно проста, Дисплей подключается стандартно по шине I2C, а сигнал подается на нулевой пин ардуины через делитель, всё это прописано в скетче.

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

Ниже привожу скетч, его нужно скопировать и вставить в Arduino IDE. Библиотеки если потребуются качайте с Гитхаба.

#include <Wire.h> // requried to run I2C SH1106

#include <SPI.h> // requried to run I2C SH1106

#include <Adafruit_GFX.h> // https://github.com/adafruit/Adafruit-GFX-Library

//#include <Adafruit_SSD1306.h>

#include <Adafruit_SH1106.h>

#include<NoDelay.h>

noDelay SM(100);

#define OLED_RESET 4

//Adafruit_SSD1306 display(OLED_RESET);

Adafruit_SH1106 display(OLED_RESET);

//#if (SSD1306_LCDHEIGHT != 64 )

//#error("Height incorrect, please fix Adafruit_SSD1306.h!");

//#endif

#if (SH1106_LCDHEIGHT != 64)

#error("Height incorrect, please fix Adafruit_SH1106.h!");

#endif

boolean unefois;

int analogInput = A0;                 // analog input

int hMeter = 65;                      // horizontal center for needle animation

int vMeter = 85;                      // vertical center for needle animation (outside of dislay limits)

int rMeter = 69;                      // longeur de l'aiguil defaul 80

unsigned int sample;

int MeterValue = 0;

// VU meter background mask image:

static const unsigned char PROGMEM VUMeter[] = {

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x11, 0x00, 0x01, 0x8E, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x00, 0x11, 0x00, 0x02, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x0F, 0x00, 0x00, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x20, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x03, 0x80, 0x00, 0xF0, 0x00, 0x01, 0x00, 0x20, 0x51, 0x00, 0x04, 0x70, 0x00, 0x00,

0x00, 0x00, 0x04, 0x40, 0x00, 0x88, 0x00, 0x11, 0x00, 0xF8, 0x91, 0x00, 0x0C, 0x88, 0x00, 0x00,

0x00, 0x00, 0x00, 0x40, 0x00, 0x88, 0x00, 0x0E, 0x00, 0x21, 0x11, 0x00, 0x0C, 0x88, 0x00, 0x00,

0x00, 0x00, 0x00, 0x40, 0x00, 0x88, 0x00, 0x00, 0x00, 0x22, 0x11, 0x02, 0x14, 0x88, 0x00, 0x00,

0x00, 0x00, 0x01, 0x80, 0x00, 0x70, 0x00, 0x00, 0x00, 0x03, 0xCE, 0x02, 0x14, 0x88, 0x00, 0x00,

0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xA4, 0x88, 0x00, 0x00,

0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x3E, 0x88, 0x00, 0x00,

0x00, 0x00, 0x04, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x04, 0x88, 0x00, 0x00,

0x00, 0x00, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x70, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,

0x07, 0x00, 0x00, 0x00, 0x00, 0x20, 0x41, 0x04, 0x01, 0x00, 0x40, 0x00, 0x00, 0x00, 0x0C, 0x70,

0x08, 0x80, 0x00, 0x00, 0x00, 0x10, 0x41, 0x04, 0x01, 0x00, 0x80, 0x00, 0x00, 0x00, 0x12, 0x88,

0x08, 0x80, 0x00, 0x00, 0x08, 0x11, 0xFF, 0xFC, 0x7F, 0xF0, 0x80, 0x00, 0x00, 0x00, 0x10, 0x88,

0x08, 0x80, 0x00, 0x80, 0x08, 0x3F, 0xFF, 0xFC, 0x7F, 0xFF, 0xC0, 0x40, 0x10, 0x01, 0x10, 0x88,

0x08, 0x80, 0x00, 0x42, 0x0F, 0xFF, 0x00, 0x00, 0x00, 0x1F, 0xFE, 0x40, 0x20, 0x01, 0x1C, 0x88,

0x08, 0x80, 0x00, 0x41, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xE0, 0x20, 0x07, 0xD2, 0x88,

0x08, 0x80, 0x00, 0x47, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFC, 0x20, 0x01, 0x12, 0x88,

0x08, 0x80, 0x00, 0x3F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xC0, 0x01, 0x12, 0x88,

0x07, 0x00, 0x01, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x00, 0x0C, 0x70,

0x00, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x03, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x7E, 0x10, 0x00, 0x00,

0x02, 0x00, 0x3F, 0x00, 0x00, 0x03, 0xFC, 0x04, 0x03, 0xFE, 0x00, 0x00, 0x0F, 0xE0, 0x08, 0x00,

0x01, 0x00, 0xF8, 0x00, 0x00, 0xFC, 0x10, 0x04, 0x00, 0x81, 0xE0, 0x00, 0x03, 0xF0, 0x08, 0x00,

0x01, 0x07, 0xE0, 0x00, 0x1F, 0x40, 0x10, 0x04, 0x00, 0x80, 0x3F, 0x80, 0x00, 0x78, 0x10, 0x00,

0x00, 0x9F, 0x80, 0x00, 0xE0, 0x40, 0x10, 0x00, 0x00, 0x80, 0x20, 0x70, 0x00, 0x1F, 0x10, 0x00,

0x00, 0xBC, 0x00, 0x07, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1C, 0x00, 0x07, 0xE0, 0x00,

0x00, 0xF0, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0xC0, 0x01, 0xF0, 0x00,

0x03, 0xC0, 0x01, 0xC1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x38, 0x00, 0x78, 0x00,

0x07, 0x80, 0x0E, 0x01, 0x00, 0x00, 0x08, 0x00, 0x01, 0xC0, 0x00, 0x10, 0x06, 0x00, 0x18, 0x00,

0x06, 0x00, 0x14, 0x00, 0x00, 0x00, 0x18, 0x00, 0x02, 0x20, 0x00, 0x00, 0x05, 0x80, 0x00, 0x00,

0x00, 0x00, 0xE4, 0x00, 0x00, 0x00, 0x18, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x60, 0x00, 0x00,

0x00, 0x03, 0x82, 0x00, 0x00, 0x00, 0x28, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x18, 0x00, 0x00,

0x00, 0x0C, 0x00, 0x07, 0x00, 0x00, 0x28, 0x00, 0x03, 0xC0, 0x00, 0x1C, 0x00, 0x06, 0x00, 0x00,

0x00, 0x30, 0x00, 0x08, 0x80, 0x00, 0x48, 0x00, 0x02, 0x20, 0x00, 0x22, 0x00, 0x01, 0x80, 0x00,

0x00, 0x50, 0x00, 0x00, 0x80, 0x00, 0x7C, 0x00, 0x02, 0x20, 0x00, 0x22, 0x00, 0x01, 0x40, 0x00,

0x00, 0x08, 0x00, 0x00, 0x80, 0x00, 0x08, 0x00, 0x02, 0x20, 0x00, 0x22, 0x00, 0x02, 0x00, 0x00,

0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x08, 0x00, 0x01, 0xC0, 0x00, 0x1C, 0x00, 0x02, 0x00, 0x00,

0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00,

0x00, 0x38, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x04, 0x70, 0x00,

0x00, 0x44, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x88, 0x00,

0x00, 0x44, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x40, 0x10, 0x11, 0x00, 0x00, 0x00, 0x04, 0x88, 0x00,

0x00, 0x44, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x22, 0x20, 0x11, 0x00, 0x00, 0x00, 0x04, 0x88, 0x00,

0x00, 0x44, 0x00, 0x00, 0x00, 0xFB, 0xE0, 0x22, 0x27, 0x3B, 0x9C, 0x00, 0x00, 0x04, 0x88, 0x00,

0x00, 0x44, 0x00, 0x00, 0x01, 0x0A, 0x10, 0x22, 0x20, 0x91, 0x22, 0x00, 0x00, 0x04, 0x88, 0x00,

0x00, 0x44, 0x00, 0x00, 0x01, 0x0A, 0x17, 0x15, 0x47, 0x91, 0x18, 0x00, 0x00, 0x04, 0x88, 0x00,

0x00, 0x44, 0x00, 0x00, 0x01, 0x0A, 0x10, 0x15, 0x48, 0x91, 0x04, 0x00, 0x00, 0x04, 0x88, 0x00,

0x00, 0x38, 0x00, 0x00, 0x01, 0x0A, 0x10, 0x08, 0x88, 0x91, 0x22, 0x00, 0x00, 0x04, 0x70, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0xFB, 0xE0, 0x08, 0x87, 0x88, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,

0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00

};

void setup()

{

unefois=true;

pinMode(analogInput, INPUT);                             // analog input

//display.begin(SSD1306_SWITCHCAPVCC, 0x3C);               // needed for SH1306 display

display.begin(SH1106_SWITCHCAPVCC, 0x3C);

une_fois();

display.clearDisplay();                                  // clears display from any library info displayed

}

void loop()

{

sample = analogRead(analogInput);

if(SM.update())

{

sample = map(sample,0,1023,0,1000);                        // ajuste aiguil a max position defaut 95

MeterValue = sample - 50;                                // ajuste aiguil a zero position defaut 50

display.clearDisplay();                                  // refresh display for next step

display.drawBitmap(0, 0, VUMeter, 128, 64, WHITE);       // draws background

int a1 = (hMeter + (sin(MeterValue / 57.296) * rMeter)); // meter needle horizontal coordinate

int a2 = (vMeter - (cos(MeterValue / 57.296) * rMeter)); // meter needle vertical coordinate

display.drawLine(a1, a2, hMeter, vMeter, WHITE);         // draws needle

display.display();

}

}

//fonction

void une_fois()

{

if(unefois)

{

float sensor = analogRead(A2);

float volt = map(sensor, 0, 1023, 0, 5700);   // calcul pour 0 - 30 volts avec resistance 10k et 100k

//float volt = map(sensor, 0, 1023, 0, 500);    // calcul pour 0 - 5  volts sans resistance

display.setTextColor(WHITE);

display.clearDisplay();

display.setTextSize(2);

display.setCursor(0, 10);

display.print(volt/100,1); // explication: valeur diviser par 100 et (,1) pour afficher un chiffre apres le point

display.print(" Volts");

display.setCursor(25, 40);

display.print("Meter");

display.display();

delay(100);

{

unefois=false;

}

}

}

Если что-то не получится, пишите в комментариях, постараюсь помочь.

Спасибо за внимание и до новых встреч!

Вторая часть.

Радиоприём.

Внимание: если вы читаете эту статью в "Одноклассниках" - знайте, весь контент внутри "Одноклассников" под авторством "Меандр Радиолюбитель", скопирован "Одноклассниками" очень хитрым способом. Все ссылки внутри статей, будут вас водить по скопированным статьям, там же в "Ок.ru". Там вы не сможете задать мне вопрос по интересующей теме, а так же, все ваши лайки/дизлайки так и останутся незамеченными мною на ресурсе с которого "ОК" это всё умыкнул. Так-что если хотите взаимодействовать с оригинальным контентом в первоисточнике, переходите по этой ссылке на мой Дзен канал и там, уже внутри канала, читайте, комментируйте, оценивайте.