С Arduino я почти не знаком, но вот в работе с портами кое-что понимаю. В школе мы много паяли и сопрягали наши приборы с компьютером через Game- и LPT-порты. Программы для работы с портами мы писали сами.
Я, например, сделал частотомер в 10 классе. К Game-порту я подсоединял источник переменного тока (через какую-то схему, наверно - уже забыл), а компьютер считывал сигнал и определял частоту. Такая штука работала только на чтение данных, как и сам Game-порт. А некоторые мои одноклассники делали другие штуки, которые не только принимали сигнал, но и генерировали его программными средствами и выводили через LPT-порт с целью управления чем-либо. Кстати, так можно собрать свою установку для цифрового управления ж/д макетом с компьютера.
Нужно измерять зазор
Измерять расстояние через порты проще простого, если только экспериментатор сам двигает рукоятку линейки (это выглядит как большой штангенциркуль). Тогда изменяется сопротивление линейки (это же потенциометр), а определить сопротивление через порт очень легко.
Но в случае с поездом никакой линейки нет. Всё должно происходить само. Наверно, можно поставить у зазора фоторезисторы. Чем больше зазор, тем больше световой поток. Т. е. по изменению сопротивления можно судить о величине зазора.
управлять напряжением на магнитах
Честно говоря, я не знаю, что умеют порты, когда работают на выход. Скорее всего, выходное напряжение у них фиксированное и поменять его программными средствами нельзя. Тогда есть 2 варианта - либо через потенциометр, либо через трансформатор. Вопрос только в том, как это сделать. Навскидку не могу сказать. Arduino, наверно, умеет это.