Arduino + Vendista 2g

Добрый день! Я новичок в ардуино, подключаю тестово терминал оплаты

Имел ли кто опыт подключения Vendista к Arduino по mdb? Интересует первоначальная настройка.
Схема и возможные переходники, может быть интерфейсы mdb. Читал много материала на тему подключения аппаратов, например эта и другие

На данный момент есть подключенные к ардуино rx и tx от терминала. Использую библиотеку SoftSerial, однако в консоли Com порта ничего не отображается, либо символы, схожие на сбитую кодировку

Читал документацию несколько десятков раз, информации в интернете мало.

  1. Описание протокола
    Протокол бинарный.

Спасибо за ответ! На сколько я понимаю в сериал порте я должен видеть либо нули с единицами либо биты, похожие на это: 0x01

Однако в консоле происходит это:

#include <SoftwareSerial.h>

SoftwareSerial mySerial(A2, A3);

void setup() {
  Serial.begin(115200);

  while (!Serial) {}
  Serial.println("Serial started. Init Vendista...");

  mySerial.begin(115200);

  byte sta[8] = {0x02, 0x00, 0xF7, 0xF5, 0x03, 0x01};

  delay(2000);
  Serial.println("Vendista serial started!");

  mySerial.write((byte*)sta, sizeof(sta));
}

void loop() {


  if (mySerial.available() > 0) {
    char b[30];
    int amount = mySerial.readBytes(b, 30);
    b[amount] = NULL;
    //    int ix;
    //    while (mySerial.available() > 0) {
    //      b[ix] = mySerial.read();
    //      ++ix;
    //    }
    //    b[ix] = 0;
    Serial.println(b);
  }

}

Код, ничего сложного, пытаюсь считать и вывести

^F → print as an ASCII-encoded hexadecimal

1 лайк

Спасибо! Я разобрался с консолью)
Насколько я понял передаваемые биты преобразовывались в ASCII и поэтому получались непонятные символы. Теперь буду разбираться с срс калькулятором и таблицами из документации.

Благодарю за помощь и ваше время!

SoftSerial и 115200 - не многовато ?

Настройки Uart: 115200, 8 bit, 1 stop bit, no parity. Level: 3V (5V tolerant).

Это настройки терминала в документации

Лучше тогда хард сериал использовать, могут быть пропуски

Спасибо большое, не знал, учту! У меня нанка, может быть несколько устройств Uart, думал переходить на мегу

Если чип 328PB, то есть возможность поднять два аппарfтных UART…

328P, можно ли на этом чипе

Нет …

1 лайк

Про обмен по MDB с монетоприемником с функцией выдвчи сдачи можно посмотреть тут О Multi-Drop Bus замолвите слово или торговый автомат по розливу воды с управлением по MDB / Хабр
У Вендисты достаточно простой протокол обмена если используется режим связи когда Вендиста сама отправляет принимает сообщения об оплате. Для реализации нужно всего 3-5 команд в зависимости от задач вендинга. И да вы правильно привели ссылку на документацию вендисты.

1 лайк

Забыл упомянуть в предыдущем ответе)

Добрый день, читал вашу статью про mdb, разобрался с назначением кабеля и пинов

Насколько я знаю вендиста изначально работает в таком состоянии. Теперь думаю как правильно обрабатывать команды, пробовал спрашивать у поддержки, но высылали инструкции уже для готовых терминалов. Возможно я что-то упустил в коде?

#include <SoftwareSerial.h>
SoftwareSerial mySerial(A2, A3);

#define u8 unsigned char
#define u16 unsigned short

u16 crcTable [256];
byte message[] = {0x03, 0x01};    //тело пакета для вычисления crc16

void setup() {
  Serial.begin(115200);

  while (!Serial) {}
  MakeCRC16Table();
  Serial.println("Serial started. Init Vendista...");

  mySerial.begin(115200);

  //  byte sta[8] = {0x02, 0x00, 0xF7, 0xF5, 0x03, 0x01};

  delay(1000);
  Serial.println("Vendista serial started!");

  //  mySerial.write((byte*)sta, sizeof(sta));
}

uint16_t tmr;
#define mdbDelay 100

void loop() {


  if (mySerial.available() > 0 && tmr < millis() - mdbDelay) {
    tmr = millis();
    char msg = mySerial.read();
    Serial.println(msg, HEX);
//    Serial.println(GetCRC16(message,sizeof(message)),HEX);
  }

}



void MakeCRC16Table()
{
  u16 r;
  int s, s1;
  for (s = 0; s < 256; s++)
  {
    r = ((u16)s) << 8;
    for (s1 = 0; s1 < 8; s1++)
    {
      if (r & (1 << 15))
        r = (r << 1) ^ 0x8005;
      else
        r = r << 1;
    }
    crcTable[s] = r;
  }
}

u16 GetCRC16(const u8 *buf, u16 len)
{
  u16 crc;
  crc = 0xFFFF;
  while (len--)
  {
    crc = crcTable [((crc >> 8)^*buf++) & 0xFF] ^ (crc << 8);
  }
  crc ^= 0xFFFF;
  return crc;
}

Терминал:

Почти. Стоит уточнить что команда 0x01 (ReadCard) имеет параметр “Использовать канал GSM терминала” и от этого зависит: канал и обмен сервером организует вендиста или контроллер вендингового аппарата.
вы используете команду 0x03 (ShowPicture) - по этой команде вендиста просто показывает одну из стандартных своих картинок. назначение которых описано в мануале.
Вам же нужно отправить команду 0x01 (ReadCard) с параметром Использовать канал GSM терминала=0, дождаться ответа. По ответу будет видно считана карта или нет , далее если карта успешно считана и прошла оплата придет сообщение об успешной или нет оплате. Проанализировав два этих ответа вендинговый аппарат принимает решение о выдаче товара. Командами 0x03 (ShowPicture) осуществляем помощь клиенту в пользовании аппаратом: выводим картинку “выберите товар” “поднесите карту оплаты” “оплата прошла” и т.д. У вендисты есть сообщение “Касание экрана” - это очень полезная функция.
Этого достаточно для многих аппаратов.
У вендисты есть команды ввода текста на экран, отмены транзакций и др. Но это уже когда сможете освоить хотя бы первый этап.
Вендиста может сыпать свои сообщения без предупреждения, поэтому прием нужно организовать по прерываниям , а по получению пакета декодировать его.

1 лайк

Спасибо большое!
Теперь стало более понятно, написал код для чтения карты. Жду мегу и сейчас буду разбираться какой переходник куда присоединять правильно, ибо от вендисты идет два провода mdb и на самом терминале ошибка либо 0 или редко 1. Присоединял к маме, посмотрю больше информации по работе, вроде в вашей статье было информация об этом

UPD1: разобрался с входами, ищу кабели подходящие

Пару лет назад подключал этот терминал по RS232 через обычную Atmega328P на игровой аппарат китайский. Проткол терминала действилельно намного проще чем у Vendoteka или D200 к примеру.

Да вот по протоколу пока нету вопросов, по крайней мере сейчас. Есть по подключению. Не понимаю в чем ошибка. Пробовал оба pci переходников (на фото). Провел питание и землю, работает. RX и TX провел через резисторы 1кОм (пробовал и без) к меге. GND также притянул к меге, земля общая. Однако терминал до сих пор показывает “Проблемы с автоматом. ошибка 0”

#include "GyverTimer.h"
GTimer listen(MS);

#define _u8  unsigned char
#define _u16 unsigned short

#define vendistaSerial Serial2

_u16 crcTable [256];  // создание crc таблицы

uint8_t ping [] = {0x01, 0x00, 0xE9, 0x02, 0x06};   // ping на сервер вендисты. время
uint8_t pic [] = {0x02, 0x00, 0xFD, 0xF5, 0x03, 0x01};                // картинка нажмите кнопку для оплаты картой

void setup() {
  Serial.begin(115200, SERIAL_8N1);
  vendistaSerial.begin(115200, SERIAL_8N1);

  MakeCRC16Table();

  vendistaSerial.write(pic, sizeof(pic));
  vendistaSerial.write(ping, sizeof(ping));
}

void loop() {
  vendistaSerial.write(pic, sizeof(pic));
}

от белого кабеля (удлинитель мдб от матрешки): желтый - RX, серый - TX, розовый - GND

Пакеты не отправляются на терминал через UART. Ошибка (иногда выскакивает такое же описание, но ошибка 1. Смотрел документацию, но она больше для готовых автоматов):

Доп: также предполагаю что для TX и RX нужны повышайки до 24в, возможно сигналы меги слабы

хочешь потерять апарат, ставь