В данной статье пойдёт речь о том как сделать машинку на радиоуправлении своими руками на базе микроконтроллера ATtiny2313. Другими словами — изобретаем велосипед, ибо по интернетам есть тонны примеров на Arduino и без Arduino. Несмотря на это, я тоже решил внести свою лепту.
Я не очень люблю работать с Arduino, так как не чувствуется сама идея работы с микроконтроллерами, всё спрятано в библиотеках и, если что-то нужно, просто скачиваешь нужную либу, устанавливаешь её и используешь, а как и что там в большинстве случаев остаётся тайной.
- 1 Для изготовления машинки, нам понадобится
- 2 Почему микроконтроллер ATtiny2313
- 3 Принцип работы программы на МК ATtiny2313
- 4 Схема подключения компонентов
- 5 Программа для управления
- 6 Код программы для ATtiny2313
- 7 Исходники и Java приложение
- 8 Маленькое видео
- 9 Купить компоненты на AliExpress
- 10 Похожие записи
Для изготовления машинки, нам понадобится
- микроконтроллер ATtiny2313;
- готовое шасси вместе с двигателями (танк или двухколёсный кит);
- HC-11, HC-12, TB387 или любые доступные USART радио-модули — две штуки;
- L298 — модуль драйвера двигателей;
- Аккумуляторы 18650 Li-ion — две штуки;
- Коробка (бокс) под аккумуляторы 18650 (на 2 аккумулятора);
- Преобразователь USB-UART на базе CH340G или PL2303HX;
- USBasp v2.0 ISP программатор
Ссылки на Aliexpress на всё это добро вы найдёте в конце статьи.
Почему микроконтроллер ATtiny2313
Микроконтроллер ATTiny2313 улучшенный вариант старого микроконтроллера AT90S2313. Внутри у него 120 инструкций оптимизированных для программирования на языках высокого уровня, 32 регистра общего назначения, 2 килобайта флеш-памяти для программ, 128 байт EEPROM (энергонезависимая память) и 128 байт SRAM (оперативная память). Из периферии: один 8 битный таймер/счетчик, один 16 битный таймер/счетчик, четыре ШИМ канала, 2 из которых будут использованы для управления колёсами, аналоговый компаратор, Watchdog таймер, USI универсальный последовательный интерфейс и, самое главное для данного проекта, USART. Если фьюзы выставлены на работу от внешнего кварца, кварц должен быть установлен на частоту, не превышающей максимальную по даташиту, это 20МГц.
Все вышеперечисленные характеристики более чем достаточно для наших задач. К тому же ATTiny2313 не дорогой и доступный микроконтроллер, в отличии от Arduino.
Принцип работы программы на МК ATtiny2313
Сама программа состоит из 3-х классов (USART, Queue, CmdExecutor) и основного файла main.cpp, который содержит функцию main(). Класс USART отвечает за инициализацию протокола и получения данных, в нашем случае данные — это команды. После получения, команда добавляется, push(cmd), в очередь Queue. Класс Queue, он же очередь, имеет два метода push(cmd) и pop(cmd). С помощью первого метода, как мы уже сказали, добавляем команды в очередь, а вторым, соответственно берём первую команду из очереди. В функции main() и проверяется если в очереди есть команды. Если команда нашлась main() берёт её и передаёт классу CmdExecutor, он же исполнитель команд, выполняет её — execute(cmd).
Для чего нужна была очередь команд, нельзя было просто выполнять команды сразу после получения, а не тратить время и ресурсы не очень-то и мощного ATtiny2313? Да, можно было, можно было вообще сделать этот пример из двух функций: main() и ISR(USART_RX_vect), и гуляй Вася. Однако не так, во первых, если одна команда выполняется очень много времени, а другая уже на подходе, то как тут быть? Во вторых, если микроконтроллер помимо команд выполняет ещё и другую работу, тоже очень важную, а мы эту работу будем остановить очень часто, тогда может выйти так, что результат будет не тот, да и команды не правильно могут выполнятся, особенно тогда, когда и команда и работа используют те же ресурсы.
Схема подключения компонентов
P1 (COMPIM) — COM порт, на реальной машине его нужно заменить на USART радио модуля, к примеру: HC-11, HC-12, TB387 или на любого доступного.
U1 (ATTINY2313) — микроконтроллер
U2 (L298) — модуль драйвера двигателей
Программа для управления
Управлять «бэтмобиль» можно было и с помощью пульта. Однако написать программу на Джаве намного легче, чем взять паяльник в руки и пилить пульт, да и программу можно сделать с большим функционалом, что-то добавить, что-то отображать, другое сделать конфигурируемым и вообще — возможности почти безграничны.
В моём случае эта программа всего лишь отправляет команды по USART, т.е. делает необходимый минимум задач.
Как установить Rx Tx в Java смотрим здесь, а пример приложения здесь.
Список команд
private static final byte PWM1 = '1';
— 1-я скорость;private static final byte PWM2 = '2';
— 2-я скорость;private static final byte PWM3 = '3';
— 3-я скорость;private static final byte PWM4 = '4';
— 4-я скорость;private static final byte PWM5 = '5';
— максимальная скорость;private static final byte STOP = 'a';
— стоп машина;private static final byte START = 'b';
— старт машина, включаются периферия и ШИМ, команда выполняется при включении машины;private static final byte RIGHT_FORWARD = 'c';
— правая гусеница движется вперёд;private static final byte LEFT_FORWARD = 'd';
— левая гусеница движется вперёд;private static final byte RIGHT_BACK = 'e';
— правая гусеница движется назад;private static final byte LEFT_BACK = 'f';
— левая гусеница движется назад;private static final byte ALL_FORWARD = 'g';
— обе гусеницы движутся вперёд;private static final byte ALL_BACK = 'h';
— обе гусеницы движутся назад;private static final byte LEFT_STOP = 'i';
— левая гусеница остановлена;private static final byte RIGHT_STOP = 'j';
— правая гусеница остановлена;private static final byte STOP_ALL = 'k';
— обе гусеницы остановлены;
Управление
- 5 скоростных режимов (кнопки от 1 до 5);
- Движение вперёд — обе гусеницы движутся вперёд (↑↑), нажата стрелка вверх (↑);
- Движение назад — обе гусеницы движутся назад (↓↓), нажата стрелка вниз (↓);
- Движение вперёд и направо — правая гусеница остановлена, левая движется вперёд (↑■), нажаты стрелки вверх и направо(↑→);
- Движение вперёд и налево — левая гусеница остановлена, правая движется вперёд (■↑), нажаты стрелки вверх и налево (←↑);
- Движение назад и направо — правая гусеница остановлена, левая движется назад (↓■), нажаты стрелки вниз и направо (↓→);
- Движение назад и налево — левая гусеница остановлена, правая движется назад (■↓), нажаты стрелки вниз и налево (←↓);
- Движение по кругу по часовой — левая гусеница движется назад, правая движется вперёд (↓↑), нажата стрелка налево (←);
- Движение по кругу против часовой — правая гусеница движется назад, левая движется вперёд (↑↓), нажата стрелка направо (→);
Вывод на консоль
После нажатия стрелок в консоли появятся знаки, указывающие движение машины/танка:
↑↑
■■
↓↑
■■
↑↓
■■
↓↓
■■
↑↑
■↑
↑↑
↑■
↑↑
■■
↓↓
■↓
↓↓
↓■
↓↓
■■
Настройки программы
Выход из программы: USART->Exit или Alt-F4;
Подключение: USART->Connect или Ctrl+Alt-C и выбираем COM порт;
Настройка скорости: USART->Baud или Ctrl+Alt-B и выбираем скорость передачи данных, по умолчанию 9600, такаяже установлена и в прошивке. Настроить следует перед тем, как подключиться;Настроить можно число стоп битов и число битов данных, но в нашем случае их лучше оставить 1 и 8 соответственно.
Код программы для ATtiny2313
Программа для ATtiny2313 написана на C++, а проект сделал в Eclipse C++. Как настроить Eclipse C/C++ для программирования AVR микроконтроллеров смотрите здесь.
main.cpp
#include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include "USART.h" #include "CmdExecutor.h" #include "Queue.h" void pushData(uint8_t data) { cmdQueue.push(data); } int main() { usart.init(9600); usart.setOnReceiveFunction(pushData); sei(); cmdExecutor.cmdStart(); uint8_t cmd; while (1) { if (cmdQueue.pop(cmd)) { cmdExecutor.execute(cmd); } _delay_ms(1); } return 1; }
Queue.h
#ifndef QUEUE_H_ #define QUEUE_H_ #define QUEUE_SIZE 4 class Queue { private: uint8_t queueSize; uint8_t data[QUEUE_SIZE]; public: Queue(); void push(uint8_t); uint8_t pop(uint8_t&); }; extern Queue cmdQueue; #endif /* QUEUE_H_ */
Queue.cpp
#include <avr/io.h> #include <stdlib.h> #include "Queue.h" Queue cmdQueue; Queue::Queue() : queueSize(0) { } void Queue::push(uint8_t cmd) { if (this->queueSize < QUEUE_SIZE) { this->data[this->queueSize] = cmd; this->queueSize++; } } uint8_t Queue::pop(uint8_t&cmd) { if (this->queueSize > 0) { this->queueSize--; cmd = this->data[0]; for (uint8_t i = 0; i < this->queueSize; i++) { this->data[i] = this->data[i + 1]; } return 1; } return 0; }
CmdExecutor.h
#ifndef CMDEXECUTOR_H_ #define CMDEXECUTOR_H_ #define LEFT_PWM_DDR DDRB #define RIGTH_PWM_DDR DDRB #define LEFT_PWM_PIN PINB3 #define RIGTH_PWM_PIN PINB4 #define LEFT_DDR_FORWARD DDRD #define RIGTH_DDR_FORWARD DDRD #define LEFT_DDR_BACK DDRD #define RIGTH_DDR_BACK DDRD #define LEFT_PORT_FORWARD PORTD #define RIGTH_PORT_FORWARD PORTD #define LEFT_PORT_BACK PORTD #define RIGTH_PORT_BACK PORTD #define LEFT_PIN_FORWARD PIND2 #define RIGTH_PIN_FORWARD PIND3 #define LEFT_PIN_BACK PIND4 #define RIGTH_PIN_BACK PIND5 #define PWM1 '1' #define PWM2 '2' #define PWM3 '3' #define PWM4 '4' #define PWM5 '5' #define STOP 'a' #define START 'b' #define RIGHT_FORWARD 'c' #define LEFT_FORWARD 'd' #define RIGHT_BACK 'e' #define LEFT_BACK 'f' #define ALL_FORWARD 'g' #define ALL_BACK 'h' #define LEFT_STOP 'i' #define RIGHT_STOP 'j' #define STOP_ALL 'k' class CmdExecutor { public: CmdExecutor(); void execute(uint8_t); void cmdStart(); void cmdStop(); void cmdRightForward(); void cmdLeftForward(); void cmdRightBack(); void cmdLeftBack(); void cmdAllForward(); void cmdAllBack(); void cmdStopAll(); void cmdStopLeft(); void cmdStopRight(); void cmdPwm1(); void cmdPwm2(); void cmdPwm3(); void cmdPwm4(); void cmdPwm5(); }; extern CmdExecutor cmdExecutor; #endif /* CMDEXECUTOR_H_ */
CmdExecutor.cpp
#include <stdint.h> #include <avr/io.h> #include <avr/interrupt.h> #include "USART.h" #include "CmdExecutor.h" CmdExecutor cmdExecutor; CmdExecutor::CmdExecutor() { } void CmdExecutor::execute(uint8_t cmd) { switch (cmd) { case STOP: cmdStop(); break; case START: cmdStart(); break; case RIGHT_FORWARD: cmdRightForward(); break; case LEFT_FORWARD: cmdLeftForward(); break; case RIGHT_BACK: cmdRightBack(); break; case LEFT_BACK: cmdLeftBack(); break; case ALL_FORWARD: cmdAllForward(); break; case ALL_BACK: cmdAllBack(); break; case LEFT_STOP: cmdStopLeft(); break; case RIGHT_STOP: cmdStopRight(); break; case PWM1: cmdPwm1(); break; case PWM2: cmdPwm2(); break; case PWM3: cmdPwm3(); break; case PWM4: cmdPwm4(); break; case PWM5: cmdPwm5(); break; case STOP_ALL: cmdStopAll(); break; default: break; } } void CmdExecutor::cmdStart() { LEFT_DDR_FORWARD |= 1 << LEFT_PIN_FORWARD; RIGTH_DDR_FORWARD |= 1 << RIGTH_PIN_FORWARD; LEFT_DDR_BACK |= 1 << LEFT_PIN_BACK; RIGTH_DDR_BACK |= 1 << RIGTH_PIN_BACK; LEFT_PWM_DDR |= 1 << LEFT_PWM_PIN; RIGTH_PWM_DDR |= 1 << RIGTH_PWM_PIN; cmdStopAll(); TCCR1A |= 1 << COM1A1 | 1 << COM1B1 | 1 << WGM11 | 1 << WGM10; TCCR1B |= 1 << WGM12 | 1 << CS11 | 1 << CS10; cmdPwm3(); cmdPwm3(); } void CmdExecutor::cmdStop() { cmdStopAll(); LEFT_PWM_DDR &= ~(1 << LEFT_PWM_PIN); RIGTH_PWM_DDR &= ~(1 << RIGTH_PWM_PIN); TCCR1A &= ~(1 << COM1A1 | 1 << COM1B1 | 1 << WGM11 | 1 << WGM10); TCCR1B &= ~(1 << WGM12 | 1 << CS11 | 1 << CS10); } void CmdExecutor::cmdRightForward() { cmdStopRight(); RIGTH_PORT_FORWARD |= (1 << RIGTH_PIN_FORWARD); } void CmdExecutor::cmdLeftForward() { cmdStopLeft(); LEFT_PORT_FORWARD |= (1 << LEFT_PIN_FORWARD); } void CmdExecutor::cmdRightBack() { cmdStopRight(); RIGTH_PORT_BACK |= (1 << RIGTH_PIN_BACK); } void CmdExecutor::cmdLeftBack() { cmdStopLeft(); LEFT_PORT_BACK |= (1 << LEFT_PIN_BACK); } void CmdExecutor::cmdAllForward() { cmdStopAll(); LEFT_PORT_FORWARD |= (1 << LEFT_PIN_FORWARD); RIGTH_PORT_FORWARD |= (1 << RIGTH_PIN_FORWARD); } void CmdExecutor::cmdAllBack() { cmdStopAll(); LEFT_PORT_BACK |= (1 << LEFT_PIN_BACK); RIGTH_PORT_BACK |= (1 << RIGTH_PIN_BACK); } void CmdExecutor::cmdStopAll() { LEFT_PORT_FORWARD &= ~(1 << LEFT_PIN_FORWARD); RIGTH_PORT_FORWARD &= ~(1 << RIGTH_PIN_FORWARD); LEFT_PORT_BACK &= ~(1 << LEFT_PIN_BACK); RIGTH_PORT_BACK &= ~(1 << RIGTH_PIN_BACK); } void CmdExecutor::cmdPwm1() { OCR1A = 204; OCR1B = 204; } void CmdExecutor::cmdPwm2() { OCR1A = 408; OCR1B = 408; } void CmdExecutor::cmdPwm3() { OCR1A = 612; OCR1B = 612; } void CmdExecutor::cmdPwm4() { OCR1A = 816; OCR1B = 816; } void CmdExecutor::cmdStopLeft() { LEFT_PORT_FORWARD &= ~(1 << LEFT_PIN_FORWARD); LEFT_PORT_BACK &= ~(1 << LEFT_PIN_BACK); } void CmdExecutor::cmdStopRight() { RIGTH_PORT_FORWARD &= ~(1 << RIGTH_PIN_FORWARD); RIGTH_PORT_BACK &= ~(1 << RIGTH_PIN_BACK); } void CmdExecutor::cmdPwm5() { OCR1A = 1023; OCR1B = 1023; }
USART.h
#ifndef USART_H_ #define USART_H_ class USART { private: typedef void (*OnReceiveFunction)(uint8_t); public: OnReceiveFunction onReceiveFunction; USART(); void init(uint16_t); void setOnReceiveFunction(OnReceiveFunction); // Отправка байта void transmitChar(char); // Отправка строки void transmitString(char*); // Отправка строки void transmitStringLn(char*); // Получение байта char receiveChar(); }; extern USART usart; #endif /* USART_H_ */
USART.cpp
#include <stdint.h> #include <avr/io.h> #include <avr/interrupt.h> #include "USART.h" USART usart; ISR(USART_RX_vect) { if (usart.onReceiveFunction) { usart.onReceiveFunction(UDR); } } USART::USART() : onReceiveFunction(0) { } void USART::init(uint16_t baud) { uint16_t ubrr = F_CPU / 16 / baud - 1; UBRRH = (unsigned char) (ubrr >> 8); UBRRL = (unsigned char) (ubrr); // RXC - завершение приёма // |TXC - завершение передачи // ||UDRE - отсутствие данных для отправки // |||FE - ошибка кадра // ||||DOR - ошибка переполнение буфера // |||||PE - ошибка чётности // ||||||U2X - Двойная скорость // |||||||MPCM - Многопроцессорный режим // |||||||| // 76543210 UCSRA = 0; // RXCIE - прерывание при приёме данных // |TXCIE - прерывание при завершение передачи // ||UDRIE - прерывание отсутствие данных для отправки // |||RXEN - разрешение приёма // ||||TXEN - разрешение передачи // |||||UCSZ2 - UCSZ0:2 размер кадра данных // ||||||RXB8 - 9 бит принятых данных // |||||||TXB8 - 9 бит переданных данных // |||||||| // 76543210 // разрешен приём и передача данных, прерывание при приёме данных UCSRB = 1 << RXEN | 1 << TXEN | 1 << RXCIE; // URSEL - всегда 1 // |UMSEL - режим: 1-синхронный 0-асинхронный // ||UPM1 - UPM0: 1 чётность // |||UPM0 - UPM0: 1 чётность // ||||USBS - стоп биты: 0-1, 1-2 // |||||UCSZ1 - UCSZ0: 2 размер кадра данных // ||||||UCSZ0 - UCSZ0: 2 размер кадра данных // |||||||UCPOL - в синхронном режиме - тактирование // |||||||| // 76543210 // 8-битовая посылка, 2 стоп бита UCSRC = 1 << USBS | 1 << UCSZ0 | 1 << UCSZ1; } void USART::setOnReceiveFunction(OnReceiveFunction onReceiveFunction) { this->onReceiveFunction = onReceiveFunction; } // Отправка байта void USART::transmitChar(char c) { // Устанавливается, когда регистр свободен while (!( UCSRA & (1 << UDRE))) { } UDR = c; } // Отправка строки void USART::transmitString(char str[]) { while (*str) { transmitChar(*str++); } } // Отправка строки void USART::transmitStringLn(char str[]) { transmitString(str); transmitChar((char) 13); transmitChar((char) 10); } // Получение байта char USART::receiveChar(void) { // Устанавливается, когда регистр свободен while (!(UCSRA & (1 << RXC))) { } return UDR; }
Исходники и Java приложение
Проект на C++: ATtiny2313_Car — C++.zip
Проект на Java : ATtiny2313_Car — Java.zip
Java приложение: ATiny2313_Car-1.0.0.jar.zip
Маленькое видео
Можно поподробнее как компилировать что для чего ато ничего ни понимаю что в микрокантролер что куда напишите пожалуйста
спасибо большое если возникнут вопросы напишу
подскажи пожалуйста а как в эклипс импортировать если можно по подробнее просто неочень разбираюсь
спасибо буду разбиратся
здравствуй спасибо за помощь разобрался но возник вод такой вопрос как подключить в эту схему радио модуль nrf 24l01
Уважаемый автор у меня вопрос по вашему уникальному труду. У вас по данной схеме управление двумя приводами,а возможно ли сделать так чтобы было восемь приводов и каждый управлялся бы отдельной командой?Если да то как?
Здравствуйте немоглибы вы выложить схему управления которое подключается к компьютеру
Подскажи модуль сс1101 получится использовать
подскажи как запустить програму управления в jar формати онаже скомпилированая 1 раз запустил сейчас немогу
извини запустил только он в конект невыходит
Программу запустил по модулювидно что что-то передаётся но команды не отображаются
И подскажи пожалуйста программу собрал а какой именно фаил писать в микроконтроллер
подкажи частоту которую надо у микроконтролера ставить
подскажи такое ощущение что с программой для микроконтролера чтото нето собираю компелирую ошибок нету зашиваю неработает беру собираю схему в протеуси записываю туда програмку на микроконтроллере мигают ena иenb ну и на com порте при нажатии на кнопки и всё больше ничего непроисходит мигают просто так с определенной частотой
Здравствуйте подскажите вы тему закрыли или как ато неодного ответа неполучил
выставил как ты написал тоже самое уже весь мозг сломал
http://canadianpharmacy.win/# canadian pharmacy scam
https://mexicanpharmacy.store/# mexico drug stores pharmacies
mexico pharmacies prescription drugs: mexico drug stores pharmacies — best online pharmacies in mexico
http://mexicanpharmacy.store/# buying from online mexican pharmacy
mexican mail order pharmacies mexico drug stores pharmacies mexican rx online
http://canadianpharmacy.win/# trustworthy canadian pharmacy
https://canadianpharmacy.win/# canadian pharmacy online store
india pharmacy mail order: india pharmacy — cheapest online pharmacy india
http://mexicanpharmacy.store/# buying from online mexican pharmacy
mexican drugstore online: mexican mail order pharmacies — mexico drug stores pharmacies
https://mexicanpharmacy.store/# mexico pharmacies prescription drugs
http://indianpharmacy.win/# indian pharmacies safe
mexican rx online: mexico drug stores pharmacies — mexico drug stores pharmacies
https://canadianpharmacy.win/# canadian neighbor pharmacy
online pharmacy india best online pharmacy india india pharmacy
mail order pharmacy india: india online pharmacy — mail order pharmacy india
http://indianpharmacy.win/# indian pharmacies safe
https://canadianpharmacy.win/# best canadian online pharmacy
purple pharmacy mexico price list: purple pharmacy mexico price list — buying prescription drugs in mexico online
https://canadianpharmacy.win/# prescription drugs canada buy online
india pharmacy mail order: pharmacy website india — india pharmacy
buying from canadian pharmacies canadian pharmacy win canada drugs reviews
https://canadianpharmacy.win/# best canadian pharmacy online
pharmacies in mexico that ship to usa: mexican border pharmacies shipping to usa — mexican online pharmacies prescription drugs
http://canadianpharmacy.win/# canada pharmacy online
https://indianpharmacy.win/# online shopping pharmacy india
https://indianpharmacy.win/# buy medicines online in india
mexican online pharmacies prescription drugs mexican border pharmacies shipping to usa medication from mexico pharmacy
buying prescription drugs in mexico: mexican border pharmacies shipping to usa — medicine in mexico pharmacies
indian pharmacy online indian pharmacy indian pharmacies safe
http://mexicanpharmacy.store/# mexican rx online
п»їcialis generic: Generic Cialis without a doctor prescription — Cheap Cialis
Viagra online price: Fast Pills For Men — Cheapest Sildenafil online
http://fastpillsformen.com/# Sildenafil Citrate Tablets 100mg
Generic Cialis without a doctor prescription buy cialis online Buy Cialis online
http://fastpillseasy.com/# ed online treatment
cheapest ed online: FastPillsEasy — erection pills online
erectile dysfunction medications online: FastPillsEasy — order ed pills online
https://fastpillseasy.com/# online erectile dysfunction prescription
http://fastpillsformen.com/# buy Viagra online
Generic Viagra online FastPillsForMen Cheap generic Viagra online
pills for erectile dysfunction online: FastPillsEasy — best ed meds online
Cialis over the counter: MaxPillsForMen — Buy Tadalafil 10mg
Buy Tadalafil 5mg MaxPillsForMen.com Generic Tadalafil 20mg price
Cialis without a doctor prescription: MaxPillsForMen — Cialis without a doctor prescription
ed doctor online cheap cialis cheap ed pills
cialis for sale: Generic Cialis without a doctor prescription — Cialis 20mg price
buy erectile dysfunction treatment FastPillsEasy buy erectile dysfunction pills online
buy Viagra over the counter: FastPillsForMen.com — best price for viagra 100mg
Buy Tadalafil 20mg: Generic Cialis without a doctor prescription — Cialis without a doctor prescription
https://fastpillsformen.com/# Viagra tablet online
Buy Cialis online: Generic Cialis without a doctor prescription — Generic Cialis without a doctor prescription
https://fastpillsformen.com/# Sildenafil Citrate Tablets 100mg
Cialis without a doctor prescription Tadalafil Tablet Tadalafil price
п»їcialis generic: MaxPillsForMen — Tadalafil price
order ed meds online cheap cialis online erectile dysfunction medication
cheapest cialis: MaxPillsForMen — Buy Tadalafil 20mg
Cheapest Sildenafil online: FastPillsForMen.com — Cheap generic Viagra online
ed treatments online: cheap cialis — ed meds on line
cheap erectile dysfunction pills fast pills easy cheap ed medicine
Viagra without a doctor prescription Canada: FastPillsForMen.com — Generic Viagra for sale
cialis for sale Max Pills For Men Generic Tadalafil 20mg price
https://fastpillsformen.com/# Viagra generic over the counter
buy erectile dysfunction medication cheap cialis erectile dysfunction medication online
Cheap Cialis: MaxPillsForMen.com — cialis for sale
cheap ed pills online: fast pills easy — cheapest ed medication
Generic Cialis price Generic Cialis without a doctor prescription Generic Cialis price
where can i buy erectile dysfunction pills: fast pills easy — ed medications online
https://fastpillseasy.com/# buy ed medication
http://maxpillsformen.com/# Buy Tadalafil 10mg
order viagra: buy viagra online — best price for viagra 100mg
sildenafil 50 mg price: FastPillsForMen.com — cheapest viagra
https://fastpillseasy.com/# buy ed medication
http://maxpillsformen.com/# cialis for sale
Cialis 20mg price in USA Generic Cialis without a doctor prescription Cialis over the counter
https://fastpillsformen.com/# Sildenafil 100mg price
Cialis 20mg price in USA MaxPillsForMen.com buy cialis pill
Generic Tadalafil 20mg price: cheapest cialis — Cialis 20mg price
Viagra online price: buy viagra online — sildenafil over the counter
http://fastpillsformen.com/# Viagra without a doctor prescription Canada
best ed pills online: generic ed meds online — pills for erectile dysfunction online
how to get ed meds online cheap cialis ed pills cheap
cost of ed meds: fast pills easy — ed medications cost
http://fastpillseasy.com/# pills for ed online
https://fastpillsformen.com/# buy viagra here
best online ed treatment FastPillsEasy cheap ed
п»їcialis generic Generic Cialis without a doctor prescription Generic Cialis without a doctor prescription
https://fastpillseasy.com/# buy ed meds online
cheapest online ed meds: fast pills easy — ed treatments online
order ed meds online FastPillsEasy ed pills
Viagra online price cheap viagra over the counter sildenafil
Viagra tablet online cheap viagra Sildenafil Citrate Tablets 100mg
Viagra online price: Fast Pills For Men — Cheap generic Viagra online
Cialis 20mg price in USA: Generic Cialis without a doctor prescription — Generic Cialis without a doctor prescription
https://fastpillseasy.com/# discount ed meds
online ed treatments fast pills easy ed online prescription
Viagra Tablet price Fast Pills For Men Viagra online price
over the counter sildenafil: buy Viagra online — buy Viagra online
erectile dysfunction pills for sale cheap cialis low cost ed meds online
erectile dysfunction medications online: buy erectile dysfunction pills online — where to buy erectile dysfunction pills
Cheap generic Viagra online FastPillsForMen Cheap Sildenafil 100mg
order ed meds online: ed rx online — ed pills
sweet bonanza yorumlar sweet bonanza oyna sweet bonanza slot
Casino Siteleri: en kaliteli bahis siteleri — canl? casino siteleri
canl? casino siteleri Canl? Casino Siteleri canl? casino siteleri
deneme bonusu veren yeni siteler deneme bonusu veren yeni siteler deneme bonusu veren siteler
https://denemebonusuverensiteler25.com/# deneme bonusu veren siteler
Casino Siteleri: Canl? Casino Siteleri — Casino Siteleri
slot oyunlar?: slot oyunlar? puf noktalar? — slot siteleri
slot casino siteleri slot siteleri en kazancl? slot oyunlar?
http://casinositeleri25.com/# casino bahis siteleri
sweet bonanza sweet bonanza giris sweet bonanza
Casino Siteleri: guvenilir casino siteleri — Casino Siteleri
deneme bonusu veren yeni siteler: yeni deneme bonusu veren siteler — deneme bonusu veren siteler
slot casino siteleri slot oyunlar? puf noktalar? en kazancl? slot oyunlar?
slot oyunlar? puf noktalar?: en kazancl? slot oyunlar? — slot casino siteleri
en cok kazand?ran slot oyunlar? en kazancl? slot oyunlar? az parayla cok kazandiran slot oyunlar?
yat?r?ms?z deneme bonusu veren siteler: denemebonusuverensiteler25 — deneme bonusu veren siteler
sweet bonanza giris: sweet bonanza demo oyna — sweet bonanza giris
sweet bonanza guncel sweet bonanza guncel sweet bonanza oyna
deneme bonusu veren yeni siteler: yeni deneme bonusu veren siteler — yat?r?ms?z deneme bonusu veren siteler
yeni deneme bonusu veren siteler: deneme bonusu veren siteler — yeni deneme bonusu veren siteler
Canl? Casino Siteleri 2025 yatД±rД±m ЕџartsД±z deneme bonusu veren siteler casino bahis siteleri
guvenilir slot siteleri: en kazancl? slot oyunlar? — slot oyunlar? puf noktalar?
en cok kazand?ran slot oyunlar? slot oyunlar? puf noktalar? az parayla cok kazandiran slot oyunlar?
yat?r?ms?z deneme bonusu veren siteler: deneme bonusu veren siteler yeni — denemebonusuverensiteler25
slot oyunlar? puf noktalar? en kazancl? slot oyunlar? en cok kazand?ran slot oyunlar?
п»їcasino: guvenilir casino siteleri — Canl? Casino Siteleri
slot casino siteleri: en kazancl? slot oyunlar? — slot siteleri
bonus veren idda siteleri
deneme bonusu veren yeni siteler: denemebonusuverensiteler25 — yat?r?ms?z deneme bonusu veren siteler
deneme bonusu veren siteler: yat?r?ms?z deneme bonusu veren siteler — deneme bonusu veren siteler yeni
sweet bonanza guncel sweet bonanza demo oyna sweet bonanza kazanma saatleri
deneme bonusu veren yeni siteler: deneme bonusu veren siteler yeni — yat?r?ms?z deneme bonusu veren siteler
sweet bonanza demo oyna sweet bonanza guncel sweet bonanza demo oyna
sweet bonanza guncel: sweet bonanza — sweet bonanza demo oyna
canl? casino siteleri Casino Siteleri Casino Siteleri
https://casinositeleri25.com/# Deneme Bonusu Veren Siteler
sweet bonanza demo oyna: sweet bonanza slot — sweet bonanza oyna
deneme bonusu veren siteler yeni: deneme bonusu veren siteler — deneme bonusu veren siteler
slot siteleri: slot casino siteleri — slot oyunlar? puf noktalar?
bonus veren siteler en guvenilir casino siteleri Deneme Bonusu Veren Siteler
yeni deneme bonusu veren siteler: denemebonusuverensiteler25 — deneme bonusu veren siteler
deneme bonusu veren siteler yeni denemebonusuverensiteler25 denemebonusuverensiteler25