Tuesday 7 February 2017

Develop STM32 dengan STM32cubeMx + OpenSTM32 IDE

Banyak temen² yang masih ngoprek STM32 di Keil, yang harus nyari software crack²an. Bebas sih, tapi saya sepaham dengan dosen saya saat kuliah dulu. Ilmu yang bermanfaat tidak berasal dari barang curian. Sekali lagi ini bukan pemaksaan, kalau tetap pakai Keil stm32cubeMX bisa generate juga untuk project yang untuk keil.
STM32cubeMX itu merupakan kode generator dari ST untuk inisial project STM32. Di sini saya akan bahas untuk STM32 Discovery. Pertama-tama dapat download stm32cubeMX disini. Tapi harus login dulu. Setelah download selesei extract dan jalani Programnya.
Menu awalnya dapat dilihat seperti ini.
Untuk generate project STM32F4-Discovery kita cuma butuh klik New Project. Setelah itu Klik panel yang Board Selector. Setelah itu kita pilih boardnya seperti gambar dibawah ini.
 

Harusnya kita sudah masuk di menu khusus board di STM32F4-Discovery seperti ini.
Dari gambar kita tahu bahwa beberapa pin sudah auto inisialisasi sama cubeMX nya. Contoh untuk Led yang tersambung pada board STM32F4-Discovery dikasih nama LD3 ~ LD6 Di cubeMx. Untuk project coba² seperti blink Led. Inisialisasi ini sudah cukup. Misal butuh beberapa interface tambahan seperti USART atau SPI tinggal ditambahkan di menu sebelah kiri itu. Nanti pin-nya juga akan auto inisialisasi.
Ada satu setting penting yang belum di generate-kan yaitu clock STM32F4. Disebelah kiri menu kita klik RCC> HSE >Pilih Crystal Ceramic Resonator. Setelah dilihat pada menu pin STM32, pin PH0 & PH1 akan tampak menjadi hijau. Setelah itu kita tinggal memilih menu tab Clock Configuration setting clock source ke HSE, serta clock cpeed menjadi 168MHz. Setting clock dapat dilihat pada gambar dibawah ini.

Selanjutnya kita generate project tadi Pertama klik tab Project diatas trus pilih setting. Silahkan dikasih nama projectnya dan pilih penyimpana directory nya. Setelah itu pilih SW4STM32 sebagai toolchain/IDE nya. SW4STM32 itu merupakan toolchain untuk develop dengan openSTM32. Untuk keil dapat memilih IDE MDK-ARM. Lebih jelasnya seperti gambar dibawah ini.
Beberapa kali saya menemukan bug di code generator nya. Karena beberapa menu yang saya pilih kadang tidak sesuai dengan generator nya. Saya bisa menemukan agar code nya sesuai dengan memeilih menu tab Code Generator setelah itu mencentang option "Generate Peripheral initialization as a pair of .c/.h files per periperal". Tutup project setting dengan klik OK.  Klik tab Project lagi dan generate code. Harusnya project yang kita kenerate sudah jadi dan siap di import ke openSTM32. 
Selanjutnya kita akan meng-import program dari cubeMX kedalam openSTM32. Untuk mendapatkan opnSTM32 dapat di download dari sini. Tapi lagi² ya harus login dulu. Buat akun aja yang belum punya akun. Tinggal download dan jalankan.Sedangkan saya sendiri menggunakan eclipse ya saya download sendiri kemudian saya install plugin STM32. Di eclipse tinggal klik help > Install new software > Add > Name isi dengan openSTM32. Location diisi dengan:http://www.openstm32.org/Eclipse-updates/org.openstm32.system-workbench.site. Seperti gambar di bawah ini.
Setelah itu klik OK. Eclipse akan me-refresh link nya dan memunculkan 2 plugin. Instal keduanya. Membutuhkan waktu yang lumayan lama untuk menginstall karena eclipse akan mendownload plugin tersebut.
Klik next > finish. Apabila ada notifikasi untuk licensi klik accept saja. Setelah install selesei kita sudah punya compiler eclipse dengan openSTM32.
Dari part 1 kita sudah mencoba generate project dari cubeMX. import hasil generate tersebut dengan import > existing project into workspace > next > browse > arahkan ke project hasil generate cubeMX tadi.

Seharusnya project tadi sudah bisa di compile di eclipse. Selamat Ngoprek !!



Tuesday 31 May 2016

[PROJECT] Online clock tanpa RTC dengan Arduino & Ethernet Shield

Kita terkadang punya project yang sudah terhubung dengan Ethernet dan Internet. Kita juga sering membutuhkan data logger sehingga waktu yang akurat dibutuhkan. Banyak orang yang menambah modul RTC. Penambahan modul RTC ini sudah benar menurut fungsinya. Tapi terkadang kita juga malas karena boardnya jadi lebih kompleks. Padahal kita bisa mengambil data waktu di NTP, yang berformat UNIX time.
Apa itu NTP Server Beserta Fungsinya ?

NTP Server - NTP merupakan kepanjangan dari Network Time Protocol adalah sebuah protokol yang berfungsi untuk menyamakan waktu dari setiap komputer yang terhubung dengan jaringan dengan komputer server dalam jaringan tersebut, bisa pada jaringan LAN (Local Area Network) maupun pada jaringan Internet, NTP itu sendiri menggunakan jalur data TCP/IP. NTP Menggunakan komunikasi UDP dengan port 123.

Library yang dibutuhkan :
  1. Ethernet (bawaan Arduino)
  2. TimeLib (https://github.com/PaulStoffregen/Time)
Copy paste program dibawah ini ke Arduino IDE. Asal library benar pasti akan sukses. Pastikan bahwa koneksi internet nya benar (Gateway, DNS, Subnet, dsb..).
Coding:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
#include <TimeLib.h>

// Enter a MAC address for your controller below.
// Newer Ethernet shields have a MAC address printed on a sticker on the shield
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0x12 };

// Set the static IP address to use if the DHCP fails to assign
IPAddress ip(192, 168, 5, 198);
IPAddress myDns(140, 0, 223, 250);
IPAddress gateway(192, 168, 5, 9);
IPAddress subnet(255, 255, 255, 0);

unsigned int localPort = 8888;       // local port to listen for UDP packets
unsigned long unixTime, ticker1, ticker2, ticker3, minus;

//char timeServer[] = "ntp.lipi.go.id"; // time.nist.gov NTP server
char timeServer[] = "pool.ntp.org"; // time.nist.gov NTP server
char timeZone = 7, ite = 0;

const int NTP_PACKET_SIZE = 48; // NTP time stamp is in the first 48 bytes of the message

byte packetBuffer[ NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets

bool DHCP = true, reqTime = false;

// A UDP instance to let us send and receive packets over UDP
EthernetUDP Udp;

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(115200);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }
  // start the Ethernet connection:
  //if (Ethernet.begin(mac) == 0)
  {
    Serial.println("Failed to configure Ethernet using DHCP");
    Ethernet.begin(mac, ip, myDns, gateway, subnet);
    DHCP = false;
  }
  setSyncProvider(getNtpTime);
  Udp.begin(localPort);
  ticker2 -= 60000; 
}

void loop() {
  if (millis() - ticker2 >= 60000) {
    ticker2 = millis();
    ticker3 = millis();
    sendNTPpacket(timeServer); // send an NTP packet to a time server
    minus = (millis() - ticker3) / 1000;
    reqTime = true;
    ite = 0;
  }
  if (millis() - ticker3 >= 1000 && reqTime == true) {
    ticker3 = millis();
    ite++;
    if (Udp.parsePacket()) {
      Udp.read(packetBuffer, NTP_PACKET_SIZE);
      unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
      unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
      unsigned long secsSince1900 = highWord << 16 | lowWord;
      if (secsSince1900 != 1145324612) {
        unsigned long epoch = secsSince1900 - 2208988800UL;
        unixTime = epoch;
        setTime(epoch + timeZone * SECS_PER_HOUR + ite);
        reqTime = false;
      }
    }
  }
  if (millis() - ticker1 >= 1000) {
    ticker1 = millis();
    digitalClockDisplay();
  }
  if (DHCP == true)
    Ethernet.maintain();
  delay(10);
}

// send an NTP request to the time server at the given address
void sendNTPpacket(char* address) {
  // set all bytes in the buffer to 0
  memset(packetBuffer, 0, NTP_PACKET_SIZE);
  // Initialize values needed to form NTP request
  // (see URL above for details on the packets)
  packetBuffer[0] = 0b11100011;   // LI, Version, Mode
  packetBuffer[1] = 0;     // Stratum, or type of clock
  packetBuffer[2] = 10;     // Polling Interval
  packetBuffer[3] = 0xEC;  // Peer Clock Precision
  // 8 bytes of zero for Root Delay & Root Dispersion
  packetBuffer[12]  = 49;
  packetBuffer[13]  = 0x4E;
  packetBuffer[14]  = 49;
  packetBuffer[15]  = 52;

  // all NTP fields have been given values, now
  // you can send a packet requesting a timestamp:
  Udp.beginPacket(address, 123); //NTP requests are to port 123
  Udp.write(packetBuffer, NTP_PACKET_SIZE);
  Udp.endPacket();
}

void digitalClockDisplay() {
  // digital clock display of the time
  Serial.print(hour());
  printDigits(minute());
  printDigits(second());
  Serial.print(" ");
  Serial.print(day());
  Serial.print(" ");
  Serial.print(month());
  Serial.print(" ");
  Serial.print(year());
  Serial.println();
}
void printDigits(int digits) {
  // utility for digital clock display: prints preceding colon and leading 0
  Serial.print(":");
  if (digits < 10)
    Serial.print('0');
  Serial.print(digits);
}
time_t getNtpTime() {
  return unixTime + timeZone * SECS_PER_HOUR;
}



[TUTORIAL] Porting arduino library ke gelatino (ATmega16 & ATmega32)

Cara porting berikut ini adalah mengedit library awal arduino agar support pada Gelatino atmega16/32. Sehingga kita dapat dengan mudah menggunakan library tersebut. Semoga dapat membantu, karena saya sering mendapat banyak pertanyaan tentang penggunaan library yang error.

Caranya,
  1. Buka folder library di lokasi Arduino IDE di install
  2. Buka Library file .h yang akan di pakai, misal servo.h
  3. Kemudian paste kan coding patch nya di file .h tersebut.
Patchnya tidak akan selalu berhasil, ada beberapa library yang masih error. Hal ini dikarenakan,
  1. Library tersebut memakai pinChange interrupt (PCINT), contoh Software Serial
  2. Atau beberapa register PWM yang atmega16 atau atmega32 tidak punya. 

Coding patch file .h

#if defined(__AVR_ATmega16__) || defined(__AVR_ATmega32__)

#define OCR0A   OCR0
#define EIMSK   GICR
#define EIFR    GIFR
#define TIMSK0  TIMSK
#define TIMSK1  TIMSK
#define TIMSK2  TIMSK
#define TIFR0   TIFR
#define TIFR1   TIFR
#define TIFR2   TIFR
#define SPMCSR  SPMCR
#define SMCR    MCUCR
#define EICRA   MCUCR
#define MCUSR   MCUCSR
#define TCCR0A  TCCR0
#define ADCSRB  SFIOR
#define TCCR2A  TCCR2
#define OCR2A   OCR2
#define WDTCSR  WDTCR
#define UBRR0H  UBRRH
#define UCSR0C  UCSRC
#define UDR0    UDR
#define UCSR0A  UCSRA
#define UCSR0B  UCSRB
#define UBRR0L  UBRRL
#define OCIE2A  OCIE2
#define ICIE1   TICIE1
#define OCIE0A  OCIE0
#define OCF2A   OCF2
#define OCF0A   OCF0
#define ISC20   ISC2
#define FOC0A   FOC0
#define COM0A1  COM01
#define COM0A0  COM00
#define PSRASY  PSR2
#define PSRSYNC PSR10
#define FOC2A   FOC2
#define COM2A1  COM21
#define COM2A0  COM20
#define OCR2AUB OCR2UB
#define TCR2AUB TCR2UB
#define UMSEL00 UMSEL
#define UPM10   UPM1
#define UPM00   UPM0
#define USBS0   USBS
#define UCSZ00  UCSZ1
#define UCSZ10  UCSZ2
#define UCPOL0  UCPOL
#define RXC0    RXC
#define TXC0    TXC
#define UDRE0   UDRE
#define FE0     FE
#define DOR0    DOR
#define UPE0    PE
#define U2X0    U2X
#define MPCM0   MPCM
#define RXCIE0  RXCIE
#define TXCIE0  TXCIE
#define UDRIE0  UDRIE
#define RXEN0   RXEN
#define TXEN0   TXEN
#define UCSZ02  UCSZ2
#define RXB80   RXB8
#define TXB80   TXB8
#define TIMER2_COMPA_vect           TIMER2_COMP_vect
#define TIMER2_COMPA_vect_num   TIMER2_COMP_vect_num
#define TIMER0_COMPA_vect           TIMER0_COMP_vect
#define TIMER0_COMPA_vect_num   TIMER0_COMP_vect_num 
#define USART0_RX_vect              USART_RXC_vect
#define USART0_RX_vect_num      USART_RXC_vect_num
#define USART0_UDRE_vect            USART_UDRE_vect
#define USART0_UDRE_vect_num    USART_UDRE_vect_num
#define USART0_TX_vect              USART_TXC_vect
#define USART0_TX_vect_num      USART_TXC_vect_num
#define ANALOG_COMP_vect            ANA_COMP_vect
#define ANALOG_COMP_vect_num    ANA_COMP_vect_num

#endif

Wednesday 30 September 2015

Eclipse untuk mengcompile ARM GCC di windows

Berikut saya lampirkan eclipse yg sudah saya setting untuk mendevelop ARM di Windows. Silahkan di-copy dan diekstrak di C:/. Sebelum itu silahkan dowload dulu Java Runtime(JRE) dan ST-LINK utility disini:


*note : untuk JRE silahkan download yg versi 32Bit, karena eclipse yang saya pakai eclipse

32bit.


JRE


ST-LINK utility


ELCIPSE GNU ARM GCC

didalam WORKSPACE/STM32F4discovery : sudah ada 2 project 

  1. Blink Led = Hanya menyalakan LED
  2. GPIO_EXTI = ini contoh project dari STM32cubef4 (http://www.st.com/web/en/catalog/tools/PF259243). Menyalakan LED saat tombol ditekan / Interrupt eksternal
Project yg lain mungkin bisa kita coba, nanti workspace akan saya update (semoga :D). Sementara ini baru STM32f4 discovery next saya update contoh buat STM32F4-Nucleo dan beberapa board ARM yang saya punya.

CARA BIKIN PROJECT LAIN
Silahkan copy project misalnya Blink, paste di tempat project. Kemudian rename dengan nama lain. Silahkan coba2 project dari STM32cubeF4 bagian example STM32F4-Discovery. USART misalnya, tinggal replace file folder "src" dan "include". Semua ".c" taruh di "src" dan semua ".h" taruh di include.

UPLOAD ST-LINK V2
Di eksternal tool eclipse sudah saya konfigurasi untuk upload firmware (.bin) via ST-LINK. Highlight project yang akan di download, lalu klik ST-LINKv2 di eksternal tool.


Mari para pecinta ARM Indonesia gabung di forum facebook : ARM Embedeed Indonesia


Wednesday 8 July 2015

Optiboot untuk atmega16/32/128

Sebenarnya mengubah bootloader bukanlah prioritas dalam maintenance firmware gelatino(arduino untuk atmega16/32/128). Selama ini saya memakai bootloader lama arduino versi atmega. meskipun lebih banyak makan memory toh yang penting bootloader bisa berjalan dengan baik. Saya mulai tergoda pakai optiboot gara - gara optiboot versi super yang mampu dimanfaatkan program flash misal di main() untuk menulis data di flash itu sendiri. Selama ini AVR tidak mengijinkan hal itu terjadi kecuali di memory bagian bootloader. Berikut lebih jelasnya ada di link ini,
http://majek.mamy.to/en/writing-to-internal-flash-on-arduino/

Yah meskipun belum bisa menulis flash paling enggak harus bisa fitur bootloadernya dulu lah. Setahun yang lalu saya pernah mengedit optiboot agar bisa untuk proyek gelatino. Saya cuma berhasil compile di atmega16 dan atmega32 saja. Itulah mengapa saya malas pindah ke optiboot karena atmega128 belum berhasil. Akhirnya saya coba lagi dan bertanya di bagian issue optiboot dan Alhamdulillah akhirnya optiboot pun berhasil di atmega128. 

Apabila tertarik menggunakan optiboot versi atmega16/32/128 bisa di compile sendiri/ download disini https://github.com/vanbwodonk/optiboot128
Keuntungan menggunakan optiboot yaitu sizenya lebih kecil cuma 512 Byte dan 1024 Byte(untuk atmega128) dan lebih cepat dengan baudrate 115200. Next saya mau mencoba menulis di flash lewat main program :D.

Tuesday 7 October 2014

[TUTORIAL] Seting STM32F4 dengan ARM GCC

Sebelum kita membuat suatu project kita siapkan dulu compilernya tentu saja. ARM GCC yang kita gunakan adalah dari Launchpad.net. Saya mendevelop ARM di windows jadi untuk linux caranya hampir sama cuma path nya harus disetting secara manual. 

ARM GCC masi terus berkembang jadi ada baiknya selalu mendownload versi terbarunya, dengan menggunakan ARM GCC terbaru program yang di hasilkan menjadi lebih kecil atau merevisi bug yang terdapat pada ARM GCC pendahulunya.

Langkah langkah yang perlu kita persiapkan yaitu:
Download GNU ARM GCC disini.
Install sampai pada menu terakhirnya jangan lupa centang untuk "Add path to environment variable"

Gambar 1. ADD path

Untuk mengecek apakah ARM GCC sudah terinstall dengan benar masuk ke command prompt. Ketik "arm-none-eabi-gcc --version".

Gambar 2. Test path ARM GCC


Bila keluar seperti gambar 2, berarti telah sukses menginstall GNU ARM GCC.
Tool terakhir kita butuhkan untuk mendownload firmware ke board yaitu ST-LINK utility. Download disini dan install. 

Tutorial cara compile dan menset eclipse GNU ARM GCC di windows ada dibawah ini.
http://myembeddedsystem.blogspot.co.id/2015/09/eclipse-untuk-mengcompile-arm-gcc-di.html

Tuesday 30 September 2014

Get ready for STM32F4 Discovery !!

Banyaknya perkerjaan menjadi susah untuk menulis blog. Padahal menulis blog merupakan catatan yang sangat berguna bila kelak lupa :D. Banyaknya project di kantor yang tidak mampu ditangani oleh AVR/Arduino membuat saya berpindah memakai STM32, selain harganya murah clock speed nya juga kenceng. STM32F4 Discovery merupakan awal mula yang bagus untuk memulai coba - coba mikrokontroller ARM. Bermula dari GPIO sampai penggunaan DMA(Direct Memory Access) menjadikan ARM sangat layak untuk melompat dari AVR. 
Berikut penampakan STM32F4 Discovery,
Kemungkinan untuk posting saya selanjutnya banyak menggunakan STM32F4 Discovery ini. Karena harganya dan performanya membuat project-project menjadi lebih mudah untuk di tangani single-chip apalagi kalau berhubungan dengan DSP.

Develop STM32 dengan STM32cubeMx + OpenSTM32 IDE

Banyak temen ² yang masih ngoprek STM32 di Keil, yang harus nyari software crack ²an. Bebas sih, tapi saya sepaham dengan dosen saya saat ...