понедельник, 31 декабря 2018 г.

Как подружить Xcode и Arduino

С выходом Apple HomeKit у меня появилось несколько проектов на Arduino, долгое время я использовал Arduino IDE под macOS, но как по мне, это не очень удобная и юзабельная среда, как минимум отладка в ней сделана через одно заднее место, про рефакторинг я вообще скромно умолчу. Как известно, скетчи пишутся на С++, по этому встал вопрос, можно ли использовать Xcode, в котором так же можно вести разработку на C++, или проще говоря прикрутить Xcode к Arduino.
Испытал несколько вариантов, и остановился на embedXcode, вполне годном плагине для Xcode.
В данный момент поддерживается 9я и 10я версия Xcode. На сайте данного плагина присутствует два варианта: бесплатный - embedXcode, и расширенная версия - embedXcode+, которую можно получить задонатив 25-100$.


Качаем обычную версию установщика pgk, инсталлим
После этого при запуске Xcode и создании проекта, во вкладке "macOS" должен появиться шаблон проекта embedXcode.
 Если нам нужен обычный скетч, то на следующей форме проекта выбираем:
Project Scope: Sketch (ino).
В поле Board выбираем свою плату к примеру - "Arduino Uno"

В созданном проекте у нас должен появиться скетч *.ino с содержанием функций setup() и loop(), а так же подключенными библиотеками.
Все параметры платы, как то: скорость, порт и т.д. можно настроить в файле "Makefile".

Для теста загрузки можно взять один из предыдущих примеров в моей статье "Программирование Arduino. Моргание светодиодом."
После создания скетча, его можно скомпилировать - Build, выгрузить - Upload, или выполнить все операции автоматически "All".

А после успешной загрузки светодиод на плате должен заморгать. Итого, так вот способом можно вести разработку скетчей прямо в Xcode.
Всем удачи и с наступающим НГ!



среда, 19 декабря 2018 г.

Компиляция приложение на ассемблере в Mac OS X

Данную заметку я решил по-быстрому наклипать, так как абсолютно нигде не нашел толкового ответа как скомпилить самое простое приложение, аля "Hello, World!" на ассме под операционной системой Mac OS X.

4 простых шага для создания приложения.

1. Создаем исходник на асме:
$ nano hello.asm
 
Далее в формате Mach-O:

.section __DATA,__data
str:
  .asciz "Hello world!\n"

.section __TEXT,__text
.globl _main
_main:
  movl $0x2000004, %eax          
  movl $1, %edi                    
  movq str@GOTPCREL(%rip), %rsi   
  movq $100, %rdx                 
  syscall

  movl $0, %ebx
  movl $0x2000001, %eax           
  syscall

2. Создание объектного модуля:
$ as hello.asm -o hello.o
 
3. Компиляция бинарника:
$ ld hello.o -e _main -macosx_version_min 10.8 -o hello -lSystem
 
4. Запуск:
$ ./hello
 
В результате консоль должна выдать сообщение "Hello world!"
Более подробно о формате Mach-O и командах можно почитать здесь.
Об отличиях синтаксиса Intel от AT&T здесь.
О редакторе кода ассемблера для Mac OS X с подсветкой синтаксиса в предыдущей статье.

Фаервол для Mac OS X

В современном мире у любого юзверя и организации есть какой-либо девайс: будь то шлюз, маршрутизатор, роутер и т.д. Практически все они имеют функцию NAT и встроенный фаервол, и надежно защищены с внешней стороны, по этому многие говнохакеры компьютерные злоумышленники предпочитают любыми возможными способами работать изнутри сети. Как правило, приложение доставляется трояном в письме, скриптом с вэб-сайта,  реже в качестве куска встроенного кода, в какой-либо бесплатный или пиратский софт, любезно выкладываемый пачками и тоннами на всевозможных трекерах. Еще злобнее выглядит вредоносный код, который может выполняться в единственный день в месяце или году, про такого трояна можно и не знать пока он не проявит себя (но это совсем отдельная тема, которая может занять множество времени и байт для рассуждений и примеров).
Кроме того, используя ту или иную программу, есть вероятность того, что это приложение может сливать какую либо аналитическую, статистическую (да и не только), информацию другим лицам. Да, часто разработчики встраивают кусок функционала в свою поделку для того, что бы улучшить приложение, но не всех пользователей это может устраивать. Ведь часто случается так, что эти данные утекают третьим лицам.
По этому хорошо на вооружение взять предмет, который может защищать операционную систему от врагов не только внешних, но и внутренних.
В операционной системе Mac OS можно заюзать уже полюбившийся многим пользователям фаервол под названием Little Snitch (что в переводе означает "Маленький стукач" 😀). 

Данная програмулина мониторит весь входящий\исходящий трафик и имеет несколько режимов работы. Так, к примеру, если в режиме Alert Mode 
кто либо из программного зверинца пытается отослать информацию, Little Snitch заблокирует этот трафик и выдаст сообщение пользователю, до тех пор, пока пользователь не решит что делать с подобным трафиком. 

Все просто и удобно.
Хотя и в первое время может надоедать подобными сообщениями, по этому в программе предусмотрен режим Silent Mode - Allow Connection. В таком режиме программа будет по умолчанию пропускать трафик, а в последующем можно просто бегло пробежаться по списку в правилах и проверить все что появилось за последние 24 часа.
Если же подобная ситуация не устраивает, можно выбрать режим Silent Mode - Deny Connection, тогда фаервол по умолчанию не будет пропускать трафик, и так же можно пройтись по правилам и разрешить или запретить обмен данными тем или иным приложениям, как в разрезе общего подключения так и подключения к определенным доменам или ip-адресам.

Кроме все прочих плюшек, в Little Snitch есть монитор текущих соединений, и всегда в режиме реального времени можно просмотреть какой процесс работает и куда пытается передать данные.
Конечно можно доверять Apple, надеясь что операционная система Mac OS X достаточно надежна и мало-уязвима, что приложения из как из App Store, так и сторонние разрабатывают совестливые авторы. Но даже крупные корпорации, как тот же Facebook, Microsoft и прочие гиганты уже неоднократно злоупотребляли доверием пользователей, собирая информацию. И ведь нет абсолютно никакой гарантии что завтра не найдется очередная уязвимость, благодаря которой люди с нехорошими целями могут получить доступ к этим данным. Но с Little Snitch вероятность все же меньше, а уверенности на порядок больше.
Ну и собственно ссылка на саму приложуху.

вторник, 18 декабря 2018 г.

Редактор ассемблера для Mac OS X


Для создания и редактирования ассемблерного кода в Mac OS X можно использовать текстовый редактор Atom с поддержкой синтаксиса Intel x86. Скачать последнюю версию Atom можно здесь.
Все что для этого нужно - установить  Language-Assembly плагин или Language-x86-64-assembly.




 Есть конечно небольшие недочеты с AT&T-синтаксисом, но думается - это поправимо.

понедельник, 17 декабря 2018 г.

Установка Homebrew в Mac OS X

Зачем это нужно?

Существует множество удобных и полезных кросплатформенных и совместимых Posix-приложений для UNIX-систем, к примеру nasm, midnight commander, wget, gcc-копилятор и т.д.

Для установки подобных приложений можно использовать недостающий в Mac OS X репозиторий MacPorts или homebrew.

С точки зрения актуальности и поддержки пакетов на первом месте homebrew.
Для его установки в Mac OS X переходим на страницу HomeBrew, в строке выделяем ссылку "/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
Homebrew
Homebrew

вставляем ее в терминал и жмем пару раз "Enter" и вводим пароль администратора системы
Terminal Mac OS x

После этого запустится скрипт установки homebrew. Который возможно еще подтянет и установит Command Line Tools for Xcode, а так же настроит его.
После установки можно обновить список пакетов командой:
$ brew update

Для установки программы из репозитория нужно выполнить команду:
$ brew install имя_пакета

к примеру, следующая команда установит midnight commander:
$ brew install mc

 Вот собственно и все!






четверг, 1 ноября 2018 г.

Как проверить схему Arduino, песочница для радиоэлектронщика

Иногда, нужно проверить схему Arduino, но если Вы новичок в радиоэлектронике,  или просто рассеянный человек, то есть вероятность того, что что-нибудь выйдет из строя, или попросту сгорит. Для таких случаев хорошо бы иметь симулятор электронной схемы, проверить цепь, разобраться с тем будет работать ли ваша программа написанная для Arduino с внешними устройствами. Об одном таком онлайн-сервисе я и расскажу.
Называется он Autodesk TinkercadПосле того, как вы зарегистрируетесь на этом портале, вам станет доступен Dashboard с проектами.
Выбираем в левой колонке Circuits, и создадим новый проект - Create New Circuit, перед нами откроется рабочее пространство для создания и тестирования микросхем и радио-элементов:

Эксперимент с резистором:
1. Добавим макетную плату
2. Добавим батарейку в 9 вольт и подсоединим контакты к шине макетной платы, а так же поменяем цвета проводов (черный - минус, красный - плюс).
3. Добавим мультиметр и подключим его контакты к той же шине макетной платы. Из параметров мультиметра выбираем показатель - Вольты. Жмем кнопку "Start Simulation".
В результате должна запуститься симуляция и вольтметр должен показать напряжение в 9 вольт.
4. Изменим показатель мультиметра на амперы, и увидим силу тока в 6 ампер.
5. Значит у нас сопротивление цепи - 1,5 ома (9 делить на 6), ведь мы знаем что: омы = вольты деленные на амперы.

Остановим симуляцию и добавим на макетную плату резистор 1,5 ома и повторно запустим, как мы видим на дисплее мультиметра показатель изменился до 3х ампер, то есть сопротивление цепи увеличилось с одной трети до две третих.
Тестируем код Arduino в электрической цепи:
1. Добавим на макетную плату светодиод, резистор на 220 Ω и плату - Arduino UNO.

2. Щелкним по кнопке "Code", изменим режим составления программы с "Blocks" на " Text".
3. Здесь мы можем увидеть что при добавлении Arduino уже автоматически добавился пример Blink, вида:


void setup(){
  pinMode(13, OUTPUT);
}

void loop(){
  digitalWrite(13, HIGH);
  delay(1000); // Wait for 1000 millisecond(s)
  digitalWrite(13, LOW);
  delay(1000); // Wait for 1000 millisecond(s)
}


Здесь мы видим что сигнал идет через 13 пин. И хотя я в прошлой статье "Программирование Arduino. Пример #1 - Моргание светодиодом" писал о примере Blink, там в качестве выхода был указан LED_BUILTIN, на самом деле разницы меж-ду 13 пином и LED_BUILTIN - светодиодом на плате абсолютно нету, так как они находятся на одной дорожке. Проверить это можно вставив код из предыдущего поста.
4. Запустим симуляцию, и увидим как моргают оба светодиода (первый на макетной плате, второй на Arduino UNO).
5. Если мы добавим на контакты светодиода мультиметр, то увидим падение напряжения от 1.99 вольт
До абсолютного нуля.
В целом, я постарался на 2х простых примерах показать как работает симуляция и электрическая цепь. Ведь, даже если у вас еще нет Arduino, или нет его просто под рукой, Вы все равно сможете эксперементировать и создавать исходный код для Arduino.

Ну и если вы все еще не приобрели себе Arduino, то я рекомендую посмотреть вот этот бренд на Aliexpress. 
Удачи в экспериментах с Arduino!

Программирование Arduino. Пример #3 - Подключаем температурный датчик LM35

На этом примере я покажу, как просто можно подключить сам сенсор LM35, а за тем снять показания окружающей среды с помощью температурного датчика и Arduino, после чего мы с помощью кода передадим данные в монитор порта.
Для этого нам понадобится:

1. Arduino UNO R3.
2. USB-кабель для прошивки.
3. Макетная плата.
4. 3 проводка (Папа-Папа).
5. Датчик температуры LM35.

Все это можно заказать в наборе на Aliexpress здесь, или по отдельности: Arduino и LM35.
К стати, радиоэлементы для Arduino рекомендую брать именно у Keyestudio и Wavgat, так как у этих продавцов наиболее надежный товар.

Что из себя представляет датчик LM35:
Как мы видим на изображении, внешне LM35 похож на PNP или NPN транзистор с 3 ногами.
На первую ногу подается питание - от 4 до 20 вольт, со второй мы снимаем показания температуры, третья нога бросается на землю.
LM35 - аналоговый элемент, по этому подключать среднюю ногу мы будем к аналоговому входу\выходу A0. Питание подаем на сенсор с выхода 5V, землю подключаем к GND.

На схеме я изобразил, как можно подключить на макетной плате.
Теперь приступим к написанию скетча:

int temperatureSensor = A0;              // Температурный датчик
int temperatureSensorValue = 0;          // Начальное значение температурного датчика
int temperatureSensorData = 0;           // Начальное значение данных температурного датчика

void setup() {
  pinMode(temperatureSensor,INPUT);    // Параметр пина температурного датчика

// Устанавливаем параметр передачи данных серийного порта в бодах  
  Serial.begin(9600);                  
}

void loop() {

// Считываем показатели
  temperatureSensorValue = analogRead(temperatureSensor);   

// Показатели преобразуем в градусы Цельсия
  temperatureSensorData = (125*temperatureSensorValue)>>8;  

// Выводим данные в порт
  Serial.print("Температура: ");
  Serial.print(temperatureSensorData);
  Serial.println(" C");
  delay(1000); // Ждать 1 секунду
}

Если подключили все правильно, LM35 должен снять показатели а Arduino преобразовать их в цельсии и вывести в порт монитора.
У меня получилось вот так:

Падение температуры на датчике было проверено кусочком льда на корпусе LM35, после чего значение температуры медленно, но верно поползло вниз.

вторник, 30 октября 2018 г.

Программирование Arduino. Пример #2 - Печатаем HelloWorld


Раз уж в предыдущем посте зашла речь об азах программирования, то наверное будет хорошей традицией вывести печать "HelloWorld" в порт монитора, а что-бы не было совсем скучно, выведем ее в качестве строковой переменной "message".

За тем, с интервалом в одну секунду выведем простое сообщение "return".
И после еще одной такой же паузы повторим действие:


/*
This example code
*/

String message = "";       // Инициализируем пустую строковую переменную "message".

void setup() {
  Serial.begin(9600);      // Устанавливаем параметр передачи данных серийного порта в бодах
}

void loop() {
message = "HelloWorld";    // Задаем значение переменной "message".
Serial.println(message);   // Выводим значение переменной на печать в серийный порт.
delay(1000);               // Ждать 1 секунду.
Serial.println("return");  // Выводим простое сообщение.
delay(1000);               // Ждать 1 секунду.
}

В результате, после загрузки скетча в Arduino на скорости 9600 бод мы должны увидеть сообщение "HelloWorld" и "return".
Ну и если у вас еще нет Arduino, то здесь можете прочитать о том, где его можно приобрести по сходной цене с отличным качеством.

Программирование Arduino. Пример #1 - Моргание светодиодом


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




/*
  This example code is in the public domain.

  http://www.arduino.cc/en/Tutorial/Blink
*/

// Функция setup запускается единожды, после включения или перезагрузки
void setup() {
  // Инициализация цифрового выхода LED_BUILTIN.
  pinMode(LED_BUILTIN, OUTPUT);
}

// Цикл loop будет повторяться бесконечно
void loop() {
  digitalWrite(LED_BUILTIN, HIGH); // Включение светодиода (HIGH - подача питания)
  delay(1000);                     // ждать 1 секунду
  digitalWrite(LED_BUILTIN, LOW);  // Выключение светодиода (LOW - отключение питания)
  delay(1000);                     // ждать 1 секунду
}

На фотографии Arduino UNO R3, у которой данный светодиод - желтого цвета.
Arduino UNO
Моргающий светодиод Arduino UNO R3
Так же, на мой взгляд, данный пример является чем-то на подобие "Hello World", в Arduino IDE данный скетч вызывается через меню "Файл > Примеры > Basics > Blink".
Ну а если у вас еще нет такого устройства, то вот здесь я рассказываю где его приобретал, и в какой комплектации.


Arduino. Цена & Качество


После изрядного количества покупок на Aliexpress, со временем появляется иммунитет достаточный опыт для приобретения того или иного более или менее качественного товара по приемлемой цене. В особенности, и в частности это относится с радиоэлектронным устройствам. Так к примеру, лично для меня надежность большинства радиоэлектронных компонент определяется следующими показателями:
  • Качество пайки. Конечно, качественный товар не должен быть собран "на коленке". Если конечно нет цели произвести реверс-инженеринг. Впрочем, данный фактор не является таким уж критичным, если в наличии имеется ИК паяльная станция и не лень лишний раз поработать ручками.  
  • Качество производства микросхем и радиоэлектронных компонентов. Если плата собрана из некачественных радиоэлементов и палок, то при первом же ремонте (к примеру - замена сгоревшего диода Шоттки), из-за небольшого перегрева паяльником или феном, может отвалиться что нибудь еще: USB-микросхема, резистор или транзистор. В таком случае ремонт ради ремонта - сомнительное удовольствие.
  • Качество припоя. Да, вот она Ахиллесова пята современной радиоэлектроники. Большинство производителей используют припой который окисляется через каких-то 3-4 года, иногда меньше. Обусловлено это тем, что товар должен отрабатывать именно такой срок КПД, иначе у производителей радиоэлектроники происходит стагнация рынка. Нет продаж - нет прибыли, нет прибыли - нет средств для развития. В общем, никому не нужен качественный товар, в большинстве случаев. Хотя и есть исключения из правил, но о них знают не все.
  • Наличие качественной документации, инструкции, даташитов и т.д. Что позволяет сэкономить кучу времени при разработке или применении радиоэлектронных девайсов.
  • Качественное программное обеспечение. Ну серьезно, не писать же самому кучу драйверов, программ для прошивки, интерпретаторы, компиляторы и тому подобное. Для многих и наличие более-менее адекватных библиотек для написания исходников прошивок уже является основополагающим фактором...
В итоге, либо покупать оригинальные Arduino по завышенной несколько раза цене, что при нынешнем курсе рубля\евро\доллара - совсем печально. Либо выбирать качественный бренд (хотя и подделку), но по доступной цене. Тем более товар некачественный и китайский, прилагательные, которые давно уже за частую перестали быть синонимами.

Попробовав несколько разных производителей, остановился на Keyestudio - желто-коричневом бренде Arduino, и смежных для него деталях. Большинство мелких радиодеталей я заказываю у Wavgat, так как посылки с товаром порой идут в мой город до 2х месяцев, и при таких сроках играть в рулетку не очень хочется. И хотя, данный ассортимент товара стоит чуть дороже чем  аналоги, нужно заметить что из всего перечня датчиков и плат, который я заказывал ничего бракованного пока не приходило, да и пока еще, как ни странно, ничего не вышло из строя.
Первое, что я заказал из продукции Keyestudio - набор "Super Starter Kit"


Данный набор брал как стендовый, для сборки и экспериментов в основном - IoT (умного дома). Сама Arduino UNO R3, которая шла в комплекте, очень порадовала качеством сборки.
Arduino UNO R3 - Front
Arduino UNO R3
Там же на Aliexpress приобрел пластиковый, прозрачный корпуст.к. сама плата достаточно хрупкая, и на ней легко поцарапать дорожку.

Arduino UNO R3 - Back
Arduino UNO R3
Первым же делом, плата на борту которой находится ATMGA328P, была воткнута в комп, и проверена на работоспособность скетчем Blink.

Arduino UNO R3 Blink
Arduino UNO R3 Blink
Далее, увлекшись, собрал простенький тестер для измерения падения напряжения на блоке тату-машинки, которую мне приволокли для ремонта.


Починив тату-машинку, решил все же собрать небольшую и экспериментальную модель домашней сигнализации, на борту которой:

  • Датчик газа и CO2.
  • Пару датчиков протечки (к слову в набор они не входят и я их приобретал отдельно).
  • Датчик геркон (открытия\закрытия дверей).
  • Инфракрасный датчик огня.
  • Плюс, еще аналоговую пьезо-пищалку.  

Но об этом я напишу отдельную статью, так как на мой взгляд это заслуживает отдельной темы.
Из минусов: в наборе присутствует только блок питания от 6 пальчиковых батареек, а вот блок питания от розетки в комплект не входит. Хотя сама Arduino умеет питаться от USB-кабеля, я все же заказал блок питания отдельно тут.
Даже макетная плата, которая шла в комплекте, на столько понравилась своим качеством, что потом еще было заказано парочку таких же.
Еще много и много всего было приобретено в Keyestudio. И об этом я напишу множество еще статей. А пока, качеством Keyestudio я вполне доволен, что позволяет проводить эксперименты с Arduino в свободное от работы время.
На мой взгляд, подобный набор хорошо подойдет и для ребенка от 8 лет, и для взрослого, кому интересно поэкспериментировать с платой Arduino, электрическими схемами и изучения азов программирования.
Хотя, не обязательно все брать одним набором, можно к примеру покопаться в интернет-магазине Keyestudio и взять все это по отдельности, или ограничится только нужными устройствами. К примеру там же можно найти WiFi-модуль ESP8266-1 или такой-вот Arduino NANO
Arduino NANO
Arduino NANO
В будущем планирую еще заказать самый большой набор для сборки робота на гусиничной подвеске. А пока, буду экспериментировать с тем что есть.


четверг, 27 сентября 2018 г.