Skip to the content
PCBKitNew board
2 layers72.4 × 45.7 mmEvent station, the printed circuit board in 3D

stations that have active components to engage the exchange of resources. some can be mobile.

Size
72.4 × 45.7 mm
Copper layers
2
Thickness
1.6 mm
Parts
12
Nets
28
Pads
46
Tracks, vias
62, 0
Pours
1
Routed
Yes
KiCad
KiCad 4
Created
13 Nov 2016
Updated
18 Dec 2016

Overview

Event station is an open-source printed circuit board by moonbeaminteractive, from the moonbeaminteractive/event-station repository on GitHub. It is a 2-layer board of 72.4 × 45.7 mm with 12 parts on 28 nets, routed with 62 tracks and 0 vias.

Its parts include 5 resistors, 2 diodes, 2 connectors and 1 switch.

README

README.md

event-station

stations that have active components to engage the exchange of resources. some can be mobile.

The concept has 3 main features:

###1. Area of effect We use the acoustic signal to achieve the area effect. The totem is similar to transmitters keeps sending acoustic signals. So all of the players around a totem can receive sound signals equally and then get healed.

###2. Deactivatedable It means that the totem can be destroyed by the enemies. The purpose of doing this characteristic is to improve the playability. Players can develop strategies together to think about how to protect their totems or attack enemy’s totem.

###3. Switchable system (future plan) The totem’s functionality is not limited to healing. We also designed other features like increasing team’s defense ability and increasing the attack damage. Players can switch different functions by buttons. Players can only have one effect at the same time.

Conceptual Components

  • A switch to toggle teams;
  • HP indicator for a station.

![Concept](models/concept_Artboard\ 1.png "Concept")

The main station (totem) idea we had in mind first, which is big in terms of size: Big one

After some in-class discussion, we were advised to try an attachable approach to make something smaller in size and more affordable for fabrication. However due to miscommunication, this approach is not sufficiently investigated.

How It Works

To indicate the HP status of a station (team), IR receivers shall be employed to achieve this. This part is not incorporated in the design.

The essential idea to heal players on the same team or boost their weapons is that a buzzer will be broadcasting signals constantly and only when players on the same side get close enough for the microphone on their vest to pick up the signal, to decode it and apply the corresponding effects. As illustrated in the figure below, team id is part of the commands, so that the vest knows if the signal from the station belongs to the same side and then play accordingly. ![Comm](models/concept_Artboard\ 4.png "Comm")

Electronic Components

  1. Arduino Pro Mini ATmega328 3.3V 8Mhz x1;
  2. Gikfun Active Buzzer x2;
  3. 100 Omh Resistor x2;
  4. 10K Omh Resister x1;
  5. 220 Omh Resister x2;
  6. Switch x1;
  7. LED x2;

The reason that 2 buzzers are used is that we had been experimenting with both Geortzel algorithm and Morse code, neither working properly. If we had got it done, only one buzzer will be enough, though how they are powered is a bit different, as illustrated in the circuit diagram. To summarize, Geortzel "requires" the toneAC approach, while Morese code use the normal buzzer set-up.

2 LEDs were intende to indicating different teams by color, however, by the end of this course, we only had one LED on board. But the code is supposed to work for 2 teams, with pins 3 and 5 to connect them, both with PWM capabilities.

Usage

  • The switch

    It is intended for owners to switch team betweeen 0 and 1. However, currently, to experiment on 2 audio communication approaches, thi switch is used to toggle between Goertzel and Morese code.

  • The audio signal

    It is meant for the players to heal their health points / energy / life, whatever it is called. The player have to get close enough to let the microphone on the vest to pick it up and decode it.

Experiments Of Sound Communication

toneAC, required by the Geortzel approach

Replacement to the standard Arduino tone library with twice the volume, higher quality and higher frequency. According to this Arduino Playground It is a library that produces an alternating current (AC) between two pins. But which two? It is not in a convenient location to find.

We managed to find some clue indicating that pins 9 and 10 for Arduino Pro Mini that we have been having so much fun with.

text
// ---------------------------------------------------------------------------
// Connect your piezo buzzer (without internal oscillator) or speaker to these pins:
//   Pins  9 & 10 - ATmega328, ATmega128, ATmega640, ATmega8, Uno, Leonardo, etc.
//   Pins 11 & 12 - ATmega2560/2561, ATmega1280/1281, Mega
//   Pins 12 & 13 - ATmega1284P, ATmega644
//   Pins 14 & 15 - Teensy 2.0
//   Pins 25 & 26 - Teensy++ 2.0
// Be sure to include an inline 100 ohm resistor on one pin as you normally do when connecting a piezo or speaker.
// ---------------------------------------------------------------------------
//...

The connection is illustrated by the pin9-R1-SP1-pin10 part in the whole circuit.

Circuit

To utilize interrupt on digital pins, the push button (SW1) was later attached to pin 2, as reflected in the code.

PCB

Encoding and decoding with the Goertzel Algorithm

Basically, we are trying to replicate the approach posted here, using 2 frequencies to indicate 1 or 0, then every 8 bit represent a byte. The author tried FFT, DTMF and finally suggested Goertzel is the best option based on the initial experiment. It is still a back-and-forth between time-domain and frequency-domain.

Preview of the The mathmatical models

Digital Filter

Ideally, it should work like the following:

text
// From the station, loop this message constantly to heal members of team 0. 
sendCommand("T0HEL");
// At the receiving end (Vest or weapons like Rod)
if (new_byte_arrived) {
  Serail.print(char_decoded)
}
// And we get the exact "T0HEL"

It would be every exciting to have got it to work. However, it is not successfully reproduced. Wrong decoding

ADC Interrupt to sample audio

Way more fast than analogRead, but has to keep the interrupt handling routine short in execution time. Just simple evaluation or basic interger arithmetic ops.

Endcoding and Decoding with Morse code

As suggested from the Vest team, we tried this library too, which follows the similar high level procedure, also unsuccessful.

The main takeaway is "Interrupt"

For digital pins: it is 2 and 3 on the Mini.

text
  pinMode(switch_pin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(switch_pin), flip, CHANGE);

And the routine in the interrupt handler "flip" usually applies the following logic:

text
void flip() {
  cnt ++;
  if(cnt == 2) { // A stable button press is supposed to change twice: 0 -> 1 and then 1 -> 0, but this is not prefect. 
    cnt = 0;
    use_goertzel = !use_goertzel;
  }
}

We do not if the handler could get the value as an argument, which may be more convenient. And from this point, we do think it is not appropriate to invoke digitalRead() here. Since the interrupt handler is supposed to be fast and digitalRead() may also issue interrupt which will cause dead lock. This is infered from my previous knowledge of Linux kernel dev, but not sure if it still holds true.

For analog, to capture change on A0:

text
  cli();//diable interrupts

  //set up continuous sampling of analog pin 0

  //clear ADCSRA and ADCSRB registers
  ADCSRA = 0;
  ADCSRB = 0;

  ADMUX |= (1 << REFS0); //set reference voltage
  ADMUX |= (1 << ADLAR); //left align the ADC value- so we can read highest 8 bits from ADCH register only

  ADCSRA |= (1 << ADPS2) ;//| (1 << ADPS0); //set ADC clock with 32 prescaler- 16mHz/32=500kHz
  ADCSRA |= (1 << ADATE); //enabble auto trigger
  enableADCInterrupt();//ADCSRA |= (1 << ADIE); //enable interrupts when measurement complete
  ADCSRA |= (1 << ADEN); //enable ADC
  ADCSRA |= (1 << ADSC); //start ADC measurements

  sei();//enable interrupts

ADC interrupt is handled in the ISR() routine, with a signiture of a fixed name and a vector argument. Some tutorial says this ISR() is another kind of loop(), which explains it all from a very naive perspective.

Model Fabrication Process

The station is built with internal frame as th esupporting structure and the outer layer of triangular facade that showcases game side with its unique stripes.

The Frame is built with 5/32 steel rods and 3d printed rubber joints,and the rods sit in the holes of the joints. No adhesives is required as the rods was squeezed into the holes, whose diameter is actually sightly smaller than the rods. The elasticity of 3d print rubber allowed this method to work.

Frame

The facade is made with 1/8 plexiglass sheets and black chalk board wrap, which is applied on one side of the plexiglass. Wrapped sheets is then cut and etched by laser cutter, during which process the stripes was created as laser will etch the wrap out.

![facade](/models/Photo Dec 12, 18 18 52.jpg "facede")

Eventually, The facade is glued onto the joints, which finishes the builidng process.

Totem

Prior to fabrication, the whole model was created in Solidworks, where all the parts was assembled and evaluated, and key parameters was exported, like lengths of steel rods sections. Then the facade silhouette is imported into Rhino, based on which the stripes was parametrically generated with the help of Grasshopper, a plug-in for Rhinoeroes. The Grasshopper script for the stripes is shown below. The intal Crv are the triangular silhouettes of facades. ![grasshopper](/models/grasshopper script.png "grasshopper")

Parts

12
QtyValueFootprintReferences
5RResistors_SMD:R_0805R1, R2, R3, R4, R5
2CONN_01X12Pin_Headers:Pin_Header_Straight_1x12P1, P2
2LEDLEDs:LED-3MMD1, D2
2SPEAKERConnect:bornier2SP1, SP2
1SW_PUSHButtons_Switches_SMD:SW_SPST_PTS645SW1

Questions

How big is the Event station PCB?

It measures 72.4 × 45.7 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Event station use?

12 parts. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.

Where can I download the Event station KiCad files?

From the moonbeaminteractive/event-station repository on GitHub, at the commit this page was made from: the board is hardware/ST/ST.kicad_pcb. PCBKit opens the board in the browser, with nothing to install.

Can I use the Event station design in my own project?

Its repository states no licence, so its author keeps all rights: ask moonbeaminteractive before reusing the design.

Similar boards

  • 2 layersNrf bga, the printed circuit board in 3D

    Nrf bga

    github-linguist/linguist

    Language Savant. If your repository's language is being reported incorrectly, send us a pull request!

    12 parts14kMIT
  • 2 layers66.9 × 74.5 mmDeskHop, the printed circuit board in 3D

    DeskHop

    hrvach/deskhop

    Fast Desktop Switching Device

    12 parts7.9kGPL-3.0
  • 2 layers40 × 15 mmSensors, the printed circuit board in 3D

    Sensors

    google/mozc-devices

    Circuit diagrams and firmware source code for Gboard DIY keyboards

    12 parts3kApache-2.0
  • 2 layers42.7 × 56.5 mmTle6240 driver, the printed circuit board in 3D

    Tle6240 driver

    rusefi/rusefi

    rusefi - GPL internal combustion engine control unit

    12 parts1.2k
  • 2 layers49 × 25 mm5v boost regulator, the printed circuit board in 3D

    5v boost regulator

    hackclub/OnBoard

    💡 Join 1,000 teenagers and make your first PCB with a $100 grant!

    12 parts915
  • 2 layers28.3 × 10.3 mmTap Photosensor PCB, the printed circuit board in 3D

    Tap Photosensor PCB

    VoronDesign/Voron-Tap

    Tap is a nozzle-based z-probe for the V2 and Trident printer designs. The entire toolhead moves to trigger an optical switch. Tap offers many advantages:

    12 parts716GPL-3.0
  • 2 layers25.4 × 70.4 mmTpmsniffer, the printed circuit board in 3D

    Tpmsniffer

    stacksmashing/pico-tpmsniffer

    A simple, very experimental TPM sniffer for LPC bus

    12 parts696