1010#include < Adafruit_ST7735.h> // Display-specific graphics library
1111#include < Adafruit_ZeroDMA.h> // Direct memory access library
1212
13- #define TFT_RST 37 // TFT reset pin
14- #define TFT_DC 38 // TFT display/command mode pin
15- #define TFT_CS 39 // TFT chip select pin
16- #define TFT_BACKLIGHT 7 // TFT backlight LED pin
13+ #ifdef ARDUINO_SAMD_CIRCUITPLAYGROUND_EXPRESS
14+ #define TFT_RST -1
15+ #define TFT_DC A6
16+ #define TFT_CS A7
17+ #define TFT_BACKLIGHT A3 // Display backlight pin
18+ #define TFT_SPI SPI1
19+ #define TFT_PERIPH PERIPH_SPI1
20+ Adafruit_LIS3DH accel (&Wire1);
21+ #else
22+ #define TFT_RST 37 // TFT reset pin
23+ #define TFT_DC 38 // TFT display/command mode pin
24+ #define TFT_CS 39 // TFT chip select pin
25+ #define TFT_BACKLIGHT 7 // TFT backlight LED pin
26+ #define TFT_SPI SPI
27+ #define TFT_PERIPH PERIPH_SPI
28+ Adafruit_LIS3DH accel;
29+ #endif
30+
1731
1832// Declarations for some Hallowing hardware -- display, accelerometer, SPI
19- Adafruit_ST7735 tft (TFT_CS, TFT_DC, TFT_RST);
20- Adafruit_LIS3DH accel;
33+ Adafruit_ST7735 tft (&TFT_SPI, TFT_CS, TFT_DC, TFT_RST);
2134SPISettings settings (12000000 , MSBFIRST, SPI_MODE0);
2235
2336// Declarations related to DMA (direct memory access), which lets us walk
@@ -113,11 +126,13 @@ uint32_t startTime, frames = 0; // For frames-per-second calculation
113126void setup (void ) {
114127 Serial.begin (115200 );
115128
129+ Serial.println (" Init accelerometer" );
116130 // Initialize accelerometer, set to 2G range
117131 if (accel.begin (0x18 ) || accel.begin (0x19 )) {
118132 accel.setRange (LIS3DH_RANGE_2_G);
119133 }
120134
135+ Serial.println (" Init display" );
121136 // Initialize and clear screen
122137 tft.initR (INITR_144GREENTAB);
123138 tft.setRotation (1 );
@@ -131,48 +146,49 @@ void setup(void) {
131146 digitalWrite (TFT_CS, LOW);
132147 digitalWrite (TFT_DC, LOW);
133148#ifdef ST77XX_MADCTL
134- SPI .transfer (ST77XX_MADCTL); // Current TFT lib
149+ TFT_SPI .transfer (ST77XX_MADCTL); // Current TFT lib
135150#else
136- SPI .transfer (ST7735_MADCTL); // Older TFT lib
151+ TFT_SPI .transfer (ST7735_MADCTL); // Older TFT lib
137152#endif
138153 digitalWrite (TFT_DC, HIGH);
139- SPI .transfer (0x28 );
154+ TFT_SPI .transfer (0x28 );
140155 digitalWrite (TFT_CS, HIGH);
141156
142157 pinMode (TFT_BACKLIGHT, OUTPUT);
143158 digitalWrite (TFT_BACKLIGHT, HIGH); // Main screen turn on
159+ Serial.println (" Init backlight" );
144160
145161 // Set up SPI DMA. While the Hallowing has a known SPI peripheral and this
146162 // could be much simpler, the extra code here will help if adapting this
147163 // sketch to other SAMD boards (Feather M0, M4, etc.)
148164 int dmac_id;
149165 volatile uint32_t *data_reg;
150166 dma.allocate ();
151- if (&PERIPH_SPI == &sercom0) {
167+ if (&TFT_PERIPH == &sercom0) {
152168 dma.setTrigger (SERCOM0_DMAC_ID_TX);
153169 data_reg = &SERCOM0->SPI .DATA .reg ;
154170#if defined SERCOM1
155- } else if (&PERIPH_SPI == &sercom1) {
171+ } else if (&TFT_PERIPH == &sercom1) {
156172 dma.setTrigger (SERCOM1_DMAC_ID_TX);
157173 data_reg = &SERCOM1->SPI .DATA .reg ;
158174#endif
159175#if defined SERCOM2
160- } else if (&PERIPH_SPI == &sercom2) {
176+ } else if (&TFT_PERIPH == &sercom2) {
161177 dma.setTrigger (SERCOM2_DMAC_ID_TX);
162178 data_reg = &SERCOM2->SPI .DATA .reg ;
163179#endif
164180#if defined SERCOM3
165- } else if (&PERIPH_SPI == &sercom3) {
181+ } else if (&TFT_PERIPH == &sercom3) {
166182 dma.setTrigger (SERCOM3_DMAC_ID_TX);
167183 data_reg = &SERCOM3->SPI .DATA .reg ;
168184#endif
169185#if defined SERCOM4
170- } else if (&PERIPH_SPI == &sercom4) {
186+ } else if (&TFT_PERIPH == &sercom4) {
171187 dma.setTrigger (SERCOM4_DMAC_ID_TX);
172188 data_reg = &SERCOM4->SPI .DATA .reg ;
173189#endif
174190#if defined SERCOM5
175- } else if (&PERIPH_SPI == &sercom5) {
191+ } else if (&TFT_PERIPH == &sercom5) {
176192 dma.setTrigger (SERCOM5_DMAC_ID_TX);
177193 data_reg = &SERCOM5->SPI .DATA .reg ;
178194#endif
@@ -216,10 +232,17 @@ void loop() {
216232 uint8_t mapX = (uint8_t )posX, // Current square of map
217233 mapY = (uint8_t )posY; // (before changing pos.)
218234 accel.read (); // Read accelerometer
235+ #ifdef ARDUINO_SAMD_CIRCUITPLAYGROUND_EXPRESS
236+ heading += (float )accel.x / -20000.0 ; // Update direction
237+ float v = (abs (accel.y ) < abs (accel.z )) ? // If board held flat(ish)
238+ (float )accel.y / 20000.0 : // Use accel Y for velocity
239+ (float )accel.z / -20000.0 ; // else accel Z is velocity
240+ #else
219241 heading += (float )accel.y / -20000.0 ; // Update direction
220242 float v = (abs (accel.x ) < abs (accel.z )) ? // If board held flat(ish)
221243 (float )accel.x / 20000.0 : // Use accel X for velocity
222244 (float )accel.z / -20000.0 ; // else accel Z is velocity
245+ #endif
223246 if (v > 0.19 ) v = 0.19 ; // Keep speed under 0.2
224247 else if (v < -0.19 ) v = -0.19 ;
225248 float vx = cos (heading) * v, // Direction vector X, Y
@@ -242,7 +265,7 @@ void loop() {
242265 posX = newX;
243266 posY = newY;
244267
245- SPI .beginTransaction (settings); // SPI init
268+ TFT_SPI .beginTransaction (settings); // SPI init
246269 digitalWrite (TFT_CS, LOW); // Chip select
247270 tft.setAddrWindow (0 , 0 , 128 , 128 ); // Set address window to full screen
248271 digitalWrite (TFT_CS, LOW); // Re-select after addr function
@@ -350,7 +373,7 @@ void loop() {
350373 }
351374 while (dma_busy); // Wait for last DMA transfer to complete
352375 digitalWrite (TFT_CS, HIGH); // Deselect
353- SPI .endTransaction (); // SPI done
376+ TFT_SPI .endTransaction (); // SPI done
354377
355378 if (!(++frames & 255 )) { // Every 256th frame, show frame rate
356379 uint32_t elapsed = (millis () - startTime) / 1000 ;
0 commit comments